;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016, 2017, 2018 Marius Bakke ;;; ;;; 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 . (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 (guix build-system trivial) #: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 fontutils) #: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 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 llvm) #:use-module (gnu packages kerberos) #:use-module (gnu packages ninja) #:use-module (gnu packages node) #:use-module (gnu packages pciutils) #: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 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)))) (define %debian-revision "debian/66.0.3359.26-1") (define %gentoo-revision "599be358f257098e7ba29196f6fce498b0a8d208") (define %inox-revision "365a106e298e04b4a7063559b7a0ee16888b928f") ;; Use system NSPR. (define %chromium-system-nspr.patch (debian-patch "system/nspr.patch" %debian-revision "0x54c8zhwjldlnx4754aaq0xyb24spqia3fgn94kcf686wp61srz")) ;; And system libevent. (define %chromium-system-libevent.patch (debian-patch "system/event.patch" %debian-revision "18ka0zmfd6g5yxhknh6x94bfm643v1kgczzag5sfndizsaaxrlpc")) ;; Avoid dependency on Chromiums embedded libc++ library for GN. (define %chromium-gn-libcxx.patch (debian-patch "gn/libcxx.patch" %debian-revision "14rx16abxv0pz4qyp194cy999z3390hxi80rdbjs3v2lwscx36cl")) ;; Don't show a warning about missing API keys. (define %chromium-disable-api-keys-warning.patch (debian-patch "disable/google-api-warning.patch" %debian-revision "1qf2y7jmaya43k9rbsxjjpkp5manzmbkhjj5hvfyqcdylhy30swj")) ;; Fix an assignment bug when using Clang and libstdc++. (define %chromium-clang-assignment.patch (gentoo-patch "chromium-clang-r4.patch" %gentoo-revision "0ip3pzk9is6n7icpml33ryysiq4cfrx8jlr0jkjgdg6mvl8pli3i")) ;; Fix error detecting system ffmpeg. (define %chromium-ffmpeg.patch (gentoo-patch "chromium-ffmpeg-r1.patch" %gentoo-revision "1pivcdmana4qx8sngcdpr858l0qh6bygv7azj66vg021phq5725a")) ;; Fix build failure when built with "safe_browsing_mode=0". (define %chromium-build-without-safebrowsing.patch (inox-patch "0001-fix-building-without-safebrowsing.patch" %inox-revision "0r1as6vmc6bbc7i54cxbmbm6rrwj33a12hfz6rzj0yxyqnnps00f")) ;; Use privacy-preserving defaults. (define %chromium-default-preferences.patch (inox-patch "0006-modify-default-prefs.patch" %inox-revision "1ncjij9sib7fliafpv37j1zf8zz5hvyxqad669vvadg7vvwr9rza")) ;; 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" %inox-revision "1jl978qas2ry9lnq6x42xl4qa6arxxj9a37k9j2wclz2pin8cmzn")) ;; Add DuckDuckGo and set it as the default search engine. (define %chromium-duckduckgo.patch (inox-patch "0011-add-duckduckgo-search-engine.patch" %inox-revision "0mvw1ax0gw3d252c9b1pwbk0j7ny8z9nsfywcmhj56wm6yksgpkg")) ;; Don't start a "Login Wizard" at first launch. (define %chromium-first-run.patch (inox-patch "0018-disable-first-run-behaviour.patch" %inox-revision "1y4zsqqf2125jkb1phwy9g5hcbd9xhyv5lr4xcaly66rpdzx2ayb")) (define opus+custom (package (inherit opus) (name "opus+custom") (arguments (substitute-keyword-arguments (package-arguments opus) ((#:configure-flags flags ''()) ;; Opus Custom is an optional extension of the Opus ;; specification that allows for unsupported frame ;; sizes. Chromium requires that this is enabled. `(cons "--enable-custom-modes" ,flags)))))) (define libvpx+experimental (package (inherit libvpx) ;; XXX: Chromium 66 relies on unreleased libvpx features. ;; The commit below is the tip of the "m66-3359" branch ;; as of 2018-04-19. (source (origin (method git-fetch) (uri (git-reference (url "https://chromium.googlesource.com/webm/libvpx") (commit "e9fff8a9dbcd03fbf3e5b7caaa9dc2631a79882a"))) (sha256 (base32 "1b1d89dlbr8ydakvp82cg6xnlnkz5hj7679f4pgxwlgd6x46f4g2")))) (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)))))) ;; XXX: This ugly libstdc++ variant stems from the fact that building ;; libstdc++ standalone is not officially supported by GCC upstream, and ;; the "make-libstdc++" procedure consequently builds a library without ;; threading support, since the configure script fails to detect gthreads. ;; ;; Fixing it properly would require building libgcc (which creates ;; gthr-default.h) before building libstdc++. This authors attempts ;; at doing so were unsuccessful, hence this hack. ;; ;; This behaviour changed upstream in this commit: ;; https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=630d52ca0a88d173f89634a5d7dd8aee07d04d80 ;; ...or around GCC 4.6. The libstdc++ docs are very explicit about it ;; not being designed to used standalone (even though it worked just fine ;; before 4.6, according to multiple mailing list threads around that time), ;; so upstream is not interested in improving the situation. ;; ;; In fact, there used to be an "INSTALL" document with libstdc++, which ;; is conspicuously missing in later releases. ;; ;; An alternative would be to change the GCC package to install C++ headers ;; in "include" rather than "include/c++". I tried that too; but it caused ;; a bootstrapping failure. The situation is further complicated by the ;; fact that GCC installs C++ headers in the default output, but libstdc++.so ;; ends up in "lib". ;; ;; To be continued... (define (libstdc++-from-gcc gcc) "Return a libstdc++ library extracted from gcc. The primary use case is when using compilers other than GCC." (package (inherit gcc) (source #f) (name "libstdc++") (build-system trivial-build-system) (arguments `(#:modules ((guix build utils)) #:builder (begin (use-modules (guix build utils)) (let* ((out (assoc-ref %outputs "out")) (lib (string-append out "/lib")) (include (string-append out "/include")) (gcc (assoc-ref %build-inputs "gcc")) (gcc-lib (assoc-ref %build-inputs "gcc:lib"))) (mkdir-p out) (copy-recursively (string-append gcc "/include/c++") include) (for-each (lambda (file) (install-file file lib)) (find-files (string-append gcc-lib "/lib") "^libstdc\\+\\+\\.so.*")) #t)))) (outputs '("out")) (inputs `(("gcc" ,gcc) ("gcc:lib" ,gcc "lib"))) (native-inputs '()) (propagated-inputs '()) (synopsis "GNU C++ standard library"))) (define (make-clang-toolchain clang libcxx) "Return a complete toolchain for Clang." (package (name "clang-toolchain") (version (package-version clang)) (source #f) (build-system trivial-build-system) (arguments '(#:modules ((guix build union)) #:builder (begin (use-modules (ice-9 match) (srfi srfi-26) (guix build union)) (let ((out (assoc-ref %outputs "out"))) (match %build-inputs (((names . directories) ...) (union-build out directories))) #t)))) (native-search-paths (package-native-search-paths clang)) (search-paths (package-search-paths clang)) (license (package-license clang)) (synopsis "Complete Clang tool chain for C/C++ development") (description "This package provides a complete Clang tool chain for C/C++. This includes Clang, the Guix ld wrapper, glibc, a C++ library, and Binutils.") (home-page "https://clang.llvm.org") (outputs '("out")) (inputs `(("clang" ,clang) ("libcxx" ,libcxx) ("ld-wrapper" ,(car (assoc-ref (%final-inputs) "ld-wrapper"))) ("binutils" ,binutils) ("libc" ,glibc))))) ;; When using Clang, Chromium expects to find "ar" and friends next ;; to the clang executable. For simplicity just create this union. (define chromium-clang-toolchain (make-clang-toolchain clang (libstdc++-from-gcc gcc-6))) (define-public chromium (package (name "chromium") (version "66.0.3359.139") (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 "1ck4wbi28702p1lfs4sz894ysbgm7fj79wrqj8srsy65z2ssaxdy")) (patches (list %chromium-gn-libcxx.patch %chromium-disable-api-keys-warning.patch %chromium-system-nspr.patch %chromium-system-libevent.patch %chromium-clang-assignment.patch %chromium-ffmpeg.patch %chromium-build-without-safebrowsing.patch %chromium-default-preferences.patch %chromium-restore-classic-ntp.patch %chromium-duckduckgo.patch %chromium-first-run.patch (search-patch "chromium-remove-default-history.patch"))) (modules '((srfi srfi-1) (srfi srfi-26) (ice-9 ftw) (ice-9 match) (ice-9 regex) (guix build utils))) (snippet '(begin (let ((preserved-club (map (lambda (path) ;; Prepend paths with "./" for comparison with ftw. (string-append "./" path)) (list "base/third_party/dmg_fp" "base/third_party/dynamic_annotations" "base/third_party/icu" "base/third_party/superfasthash" "base/third_party/symbolize" "base/third_party/xdg_mime" "base/third_party/xdg_user_dirs" "chrome/third_party/mozilla_security_manager" "courgette/third_party/bsdiff" "courgette/third_party/divsufsort" "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/angle/third_party/glslang" "third_party/angle/third_party/spirv-headers" "third_party/angle/third_party/spirv-tools" "third_party/angle/third_party/vulkan-validation-layers" "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" "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/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/libaom" "third_party/libaom/source/libaom/third_party/x86inc/x86inc.asm" "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/node" (string-append "third_party/node/node_modules/" "polymer-bundler/lib/third_party/UglifyJS2") "third_party/openmax_dl" "third_party/ots" ;; TODO: Build as extension. "third_party/pdfium" "third_party/pdfium/third_party/agg23" "third_party/pdfium/third_party/base" "third_party/pdfium/third_party/bigint" "third_party/pdfium/third_party/libopenjpeg20" "third_party/pdfium/third_party/skia_shared" (string-append "third_party/pdfium/third_party/freetype" "/include/pstables.h") "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/sqlite" "third_party/swiftshader" "third_party/swiftshader/third_party/llvm-subzero" "third_party/swiftshader/third_party/subzero" "third_party/s2cellid" "third_party/usb_ids" "third_party/usrsctp" "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/utf8-decoder" "v8/src/third_party/valgrind" "v8/third_party/inspector_protocol")))) (define (empty? dir) (equal? (scandir dir) '("." ".."))) (define (third_party? file) (if (string-contains file "third_party/") #t #f)) (define (useless? file) (any (cute string-suffix? <> file) '(".tar.gz" ".zip" ".exe" ".jar"))) (define (parents child) "Return a list of paths up to and including the closest third_party" (let ((lst (reverse (string-split child #\/)))) (let loop ((hierarchy lst) (result '())) (if (or (null? hierarchy) (and (not (null? result)) (string-suffix? "third_party" (car result)))) result (loop (cdr hierarchy) (cons (string-join (reverse hierarchy) "/") result)))))) (define (delete-unwanted child stat flag base level) (let ((protected (make-regexp "\\.(gn|gyp)i?$"))) (match flag ((or 'regular 'symlink 'stale-symlink) (when (or (third_party? child) (useless? child)) (unless (or (member child preserved-club) (any (cute member <> preserved-club) (parents child)) (regexp-exec protected child)) (format (current-error-port) "deleting ~s~%" child) (delete-file child))) #t) ('directory-processed (when (empty? child) (rmdir child)) #t) (_ #t)))) (nftw "." delete-unwanted 'depth 'physical) ;; Assert that each listed item is present to catch removals. (for-each (lambda (third-party) (unless (file-exists? third-party) (error (format #f "~s does not exist!" third-party)))) preserved-club) ;; 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") '("fontconfig.gn" . "third_party/fontconfig/BUILD.gn") '("freetype.gn" . "build/config/freetype/freetype.gni") '("harfbuzz-ng.gn" . "third_party/harfbuzz-ng/harfbuzz.gni") '("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") '("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 overrides the RUNPATH set by the linker. #: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\""))) (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")) (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* ((out (assoc-ref outputs "out")) (clang-toolchain (assoc-ref inputs "clang-toolchain")) (gtk+ (assoc-ref inputs "gtk+")) (mesa (assoc-ref inputs "mesa")) (nss (assoc-ref inputs "nss")) (udev (assoc-ref inputs "udev")) (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" "use_gold=false" "use_lld=false" "linux_use_bundled_binutils=false" "use_custom_libcxx=false" "use_sysroot=false" "enable_precompiled_headers=false" "goma_dir=\"\"" "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" ;; Disable "safe browsing", which pulls in a dependency ;; on the nonfree "unrar" program. "safe_browsing_mode=0" ;; GCC is poorly supported, so we use Clang for now. ;;"is_clang=false" (string-append "clang_base_path=\"" clang-toolchain "\"") "clang_use_chrome_plugins=false" ;; Optimize for building everything at once, as opposed ;; to incrementally for development. See "docs/jumbo.md". "use_jumbo_build=true" ;; Disable debugging features to save space. "symbol_level=1" "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 ;; . "use_official_google_api_keys=false" ;; Disable "field trials". "fieldtrial_testing_like_official_build=true" ;; Disable Chrome Remote Desktop (aka Chromoting). "enable_remoting=false" "use_system_freetype=true" "use_system_lcms2=true" "use_system_libjpeg=true" "use_system_libpng=true" "use_system_zlib=true" ;; This is currently not supported on GNU/Linux: ;; https://bugs.chromium.org/p/chromium/issues/detail?id=22208 ;;"use_system_sqlite=true" "use_gnome_keyring=false" ;deprecated by libsecret "use_gtk3=true" "use_openh264=true" "use_xkbcommon=true" "use_pulseaudio=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_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. (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" "clang") (setenv "CXX" "clang++") ;; FIXME: This nasty hack works around a problem where ;; Clang does not add the arch triplet to the libtsdc++ ;; search path. Fixing it seems tricky, since it only ;; searches "include/" when it detects libstdc++ ;; in GCC which is not the case in Guix; the only reason ;; libstdc++ works here is because it's already on the ;; include path... (setenv "CPLUS_INCLUDE_PATH" (string-append (getenv "CPLUS_INCLUDE_PATH") ":" clang-toolchain "/include/x86_64-unknown-linux-gnu")) ;; XXX: For some reason this is needed also for C code (libaom). (setenv "C_INCLUDE_PATH" (string-append (getenv "C_INCLUDE_PATH") ":" clang-toolchain "/include/x86_64-unknown-linux-gnu")) ;; 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=...". (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 . `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share")))) #t))))))) (native-inputs `(("bison" ,bison) ("clang-toolchain" ,chromium-clang-toolchain) ("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+" ,gtk+) ("harfbuzz" ,harfbuzz) ("icu4c" ,icu4c) ("jsoncpp" ,jsoncpp) ("lcms" ,lcms) ("libevent" ,libevent) ("libffi" ,libffi) ("libjpeg-turbo" ,libjpeg-turbo) ("libpng" ,libpng) ;;("libsecret" ,libsecret) ("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+))))