;;; 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 gexp) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix utils) #:use-module (guix build-system gnu) #:use-module (gnu packages) #:use-module (gnu packages assembly) #:use-module (gnu packages base) #:use-module (gnu packages bison) #:use-module (gnu packages compression) #:use-module (gnu packages cups) #:use-module (gnu packages curl) #:use-module (gnu packages 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 linux) #:use-module (gnu packages kerberos) #:use-module (gnu packages ninja) #:use-module (gnu packages node) #:use-module (gnu packages pciutils) #:use-module (gnu packages pkg-config) #: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 (chromium-patch-file-name pathspec) (let ((patch-name (basename pathspec))) (if (string-prefix? "chromium-" patch-name) patch-name (string-append "chromium-" patch-name)))) ;; https://salsa.debian.org/chromium-team/chromium/tree/master/debian/patches (define (debian-patch pathspec revision hash) (origin (method url-fetch) (uri (string-append "https://salsa.debian.org/chromium-team/chromium/raw/" revision "/debian/patches/" pathspec)) (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/Eloston/ungoogled-chromium (define (ungoogled-patch pathspec revision hash) (origin (method url-fetch) (uri (string-append "https://raw.githubusercontent.com/Eloston" "/ungoogled-chromium/" revision "/resources" "/patches/ungoogled-chromium/" pathspec)) (sha256 (base32 hash)) (file-name (chromium-patch-file-name pathspec)))) ;; XXX: It would be great to have (upstream-patch ...), but the API ;; at can only return ;; base64-encoded patches. (define %debian-revision "debian/68.0.3440.75-2") (define %gentoo-revision "a79be956bb7bbeaca245564ecb4a350b1203ca98") (define %inox-revision "8afa26a5ffb2e8ff52ac5b7bbdccc9f09290120e") (define %ungoogled-revision "55d1a2442dcd9efc574f6c4fa99804d5b8658e4e") (define %debian-patches (list ;; Bootstrap "GN" using system NSPR. (debian-patch "system/nspr.patch" %debian-revision "0xywgsq14xdpfdf0wb5plv5jy2738zbwj7caj2i5g9s5zpdclhsv") ;; Ditto for system libevent. (debian-patch "system/event.patch" %debian-revision "0cq5kz5yi737vb3k8v67hrr38czqm3mj6g3swh765pmfzvx5inj6") ;; Make PDFium use system OpenJPEG. (debian-patch "system/openjpeg.patch" %debian-revision "0fxvbfvmimg0ykzhsk3l0kyvhz1fgbys51ldh950106yj6dszsmx") ;; Make "Courgette" use system zlib instead of the bundled lzma. (debian-patch "system/zlib.patch" %debian-revision "1fmkiw7xrhwadvjxkzpv8j5iih2ws59l3llsdrpapw1vybfyq9nr") ;; Avoid dependency on Chromiums embedded libc++ when bootstrapping. (debian-patch "gn/libcxx.patch" %debian-revision "02w94h9jd29jyvq09yxl9g31hk8j07qzr7rg23rhibhkn1rvg38x") ;; Avoid dependency on Android tools. (debian-patch "disable/android.patch" %debian-revision "06kxx1fx9yi52h2fka71i9qqp6jh4r3w890k77nihv8arnabc0nq") ;; Do not show a warning about missing API keys. (debian-patch "disable/google-api-warning.patch" %debian-revision "0vqi3n8i1vkp2cxmza7c60fl6d03195sax0ahrk1ksa04xjbkkqv") ;; Don't override the home page set in master_preferences. (debian-patch "disable/welcome-page.patch" %debian-revision "15c6a296mkqnjdqqq90kmapn56rykb7saz4bs16han6by8q07lbx"))) (define %gentoo-patches (list ;; Fix error detecting system ffmpeg. (gentoo-patch "chromium-ffmpeg-r1.patch" %gentoo-revision "1pivcdmana4qx8sngcdpr858l0qh6bygv7azj66vg021phq5725a") ;; Add missing #include. (gentoo-patch "chromium-cors-string-r0.patch" %gentoo-revision "075lgl6g8rih21adsr3hf2mm0qm16s4w2h4h1qjh652sl941w57l"))) (define %inox-patches (list ;; Fix build without the "safe browsing" feature. (inox-patch "0001-fix-building-without-safebrowsing.patch" %inox-revision "0qchqc3i772drx0c8n44yhkx45fgdvd0h325w0qvaqrakzixbmr4") ;; Use sane defaults. In particular, don't depend on any Google services. (inox-patch "0006-modify-default-prefs.patch" %inox-revision "0sbvs6l80h8ar8na6065ihqnmcsr1b4zc21jcs2wzkrjlxsgspw6") ;; Recent versions of Chromium may load a remote search engine on the "New ;; Tab Page", which causes unnecessary and involuntary network traffic. (inox-patch "0008-restore-classic-ntp.patch" %inox-revision "16z5accrri90s922n1r6nj8rqss3g7f579dwwzkk2hdxbkc9wzyr") ;; Add DuckDuckGo and use it as the default search engine. (inox-patch "0011-add-duckduckgo-search-engine.patch" %inox-revision "0mvw1ax0gw3d252c9b1pwbk0j7ny8z9nsfywcmhj56wm6yksgpkg") ;; Don't start a "Login Wizard" at first launch. (inox-patch "0018-disable-first-run-behaviour.patch" %inox-revision "1y4zsqqf2125jkb1phwy9g5hcbd9xhyv5lr4xcaly66rpdzx2ayb"))) (define %ungoogled-patches (list ;; Disable browser sign-in to prevent leaking data at launch. (ungoogled-patch "disable-signin.patch" %ungoogled-revision "0a6akb10bzk6z6nhqa211y8rbj0ibdhhg5n92482q9sikavd8hz0"))) (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/chromium ;; Chromium 66 and later requires an unreleased libvpx, so we take the ;; commit from "third_party/libvpx/README.chromium" in the tarball. ;; XXX: Might as well reuse Chromium source. (let ((version (package-version libvpx)) (commit "e27a331778c4c99ec37262ea786a3b4cc2a491ac") (revision "0")) (package (inherit libvpx) (name "libvpx-chromium") (version (git-version version revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://chromium.googlesource.com/webm/libvpx") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "03a0443dnfn6l2v19qpw7p7k29v98c5b5hl4br93czgq0wi29m1g"))))))) (define-public chromium (package (name "chromium") (version "68.0.3440.84") (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 "1nf9xha7ncnh8g1g4c8hzk03f8ya7nd0xzwij9zs7n0qmrkx2c8h")) (patches (append %debian-patches %gentoo-patches %inox-patches %ungoogled-patches (search-patches "chromium-gcc-unique-ptr.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/http2" "net/third_party/mozilla_security_manager" "net/third_party/nss" "net/third_party/spdy" "net/third_party/quic" "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/apple_apsl" ;XXX add APSL2.0 license "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/crashpad" (string-append "third_party/crashpad/crashpad/" "third_party/zlib/zlib_crashpad.h") "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/libjingle_xmpp" "third_party/libphonenumber" "third_party/libsecret" ;FIXME: needs pkg-config support. "third_party/libsrtp" "third_party/libsync" ;TODO: package "third_party/libudev" "third_party/libwebm" "third_party/libxml" "third_party/libyuv" "third_party/lss" "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/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/skia_shared" (string-append "third_party/pdfium/third_party/freetype" "/include/pstables.h") "third_party/perfetto" "third_party/ply" "third_party/polymer" "third_party/protobuf" "third_party/protobuf/third_party/six" "third_party/pyjson5" "third_party/qcms" "third_party/rnnoise" "third_party/sfntly" "third_party/skia" "third_party/skia/third_party/skcms" "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/antlr4" "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) (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-files child stat flag base level) (let ((protected (make-regexp "\\.(gn|gyp)i?$"))) (match flag ((or 'regular 'symlink 'stale-symlink) (when (third_party? 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))) (when (and (useless? child) (file-exists? child)) (delete-file child)) #t) ('directory-processed (when (empty? child) (rmdir child)) #t) (_ #t)))) (nftw "." delete-unwanted-files '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" . "third_party/libjpeg.gni") '("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 ((guix build gnu-build-system) (guix build utils) (ice-9 ftw) (ice-9 regex) (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_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 (as of m66). "safe_browsing_mode=0" ;; 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\"" ;; Don't assume it's clang. "is_clang=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=0" "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 libraries where possible. "use_system_freetype=true" "use_system_harfbuzz=true" "use_system_lcms2=true" "use_system_libjpeg=true" "use_system_libpng=true" "use_system_zlib=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" "rtc_build_libsrtp=true" ;FIXME: fails to find headers "rtc_build_usrsctp=true" ;TODO: package this (string-append "rtc_jsoncpp_root=\"" (assoc-ref %build-inputs "jsoncpp") "/include/jsoncpp/json\"") (string-append "rtc_ssl_root=\"" (assoc-ref %build-inputs "openssl") "/include/openssl\"")) #: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* ;; XXX: Probably not needed for M69. "third_party/blink/renderer/platform/image-encoders/image_encoder.h" (("#include \"third_party/libjpeg/") "#include \"") (("#include \"third_party/libwebp/src/") "#include \"")) (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/") "")) #t)) (add-before 'configure 'prepare-build-environment (lambda* (#:key inputs #:allow-other-keys) ;; Make sure the right build tools are used. (setenv "AR" "ar") (setenv "NM" "nm") (setenv "CC" "gcc") (setenv "CXX" "g++") ;; Work around . (unsetenv "C_INCLUDE_PATH") (unsetenv "CPLUS_INCLUDE_PATH") ;; 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") #t)) (add-after 'prepare-build-environment 'bootstrap-gn (lambda _ (invoke "python" "tools/gn/bootstrap/bootstrap.py" "-s" "-v"))) (replace 'configure (lambda* (#:key configure-flags #:allow-other-keys) (let ((args (string-join configure-flags " "))) (with-directory-excursion "out/Release" ;; Generate ninja build files. (invoke "./gn" "gen" "." (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" "." "--list"))))) (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")) (preferences (assoc-ref inputs "master-preferences")) (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")) (mkdir-p lib) (copy-file preferences (string-append lib "/master_preferences")) (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) ("gcc" ,gcc-8) ;a recent compiler is required ("gperf" ,gperf) ("ninja" ,ninja) ("node" ,node) ("pkg-config" ,pkg-config) ("master-preferences" ,(local-file "chromium-master-preferences.json")) ("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) ;;("libsrtp" ,libsrtp) ("libvpx" ,libvpx/chromium) ("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) ("openjpeg" ,openjpeg) ;PDFium only ("openssl" ,openssl) ("opus" ,opus+custom) ("pango" ,pango) ("pciutils" ,pciutils) ("pulseaudio" ,pulseaudio) ("re2" ,re2) ("snappy" ,snappy) ("speech-dispatcher" ,speech-dispatcher) ("udev" ,eudev) ("valgrind" ,valgrind))) (home-page "https://www.chromium.org/") (description "Chromium is a web browser designed for speed and security. This version incorporates features from @url{https://github.com/gcarq/inox-patchset,the Inox patchset} and @url{https://github.com/Eloston/ungoogled-chromium,ungoogled-chromium} 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+))))