Merge branch 'master' into core-updates
[jackhill/guix/guix.git] / gnu / packages / chromium.scm
CommitLineData
f1e9de4d 1;;; GNU Guix --- Functional package management for GNU
f8157512 2;;; Copyright © 2019, 2020 Marius Bakke <mbakke@fastmail.com>
3df7b15e 3;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
f1e9de4d
MB
4;;;
5;;; This file is part of GNU Guix.
6;;;
7;;; GNU Guix is free software; you can redistribute it and/or modify it
8;;; under the terms of the GNU General Public License as published by
9;;; the Free Software Foundation; either version 3 of the License, or (at
10;;; your option) any later version.
11;;;
12;;; GNU Guix is distributed in the hope that it will be useful, but
13;;; WITHOUT ANY WARRANTY; without even the implied warranty of
14;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;;; GNU General Public License for more details.
16;;;
17;;; You should have received a copy of the GNU General Public License
18;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
19
20(define-module (gnu packages chromium)
21 #:use-module ((guix licenses) #:prefix license:)
22 #:use-module (guix packages)
23 #:use-module (guix gexp)
24 #:use-module (guix store)
25 #:use-module (guix monads)
26 #:use-module (guix download)
27 #:use-module (guix git-download)
28 #:use-module (guix utils)
29 #:use-module (guix build-system gnu)
30 #:use-module (gnu packages)
31 #:use-module (gnu packages assembly)
32 #:use-module (gnu packages base)
33 #:use-module (gnu packages bison)
34 #:use-module (gnu packages build-tools)
35 #:use-module (gnu packages compression)
36 #:use-module (gnu packages cups)
37 #:use-module (gnu packages curl)
38 #:use-module (gnu packages fontutils)
82ccfb1d 39 #:use-module (gnu packages freedesktop)
f1e9de4d
MB
40 #:use-module (gnu packages ghostscript)
41 #:use-module (gnu packages gl)
42 #:use-module (gnu packages glib)
43 #:use-module (gnu packages gnome)
f1e9de4d
MB
44 #:use-module (gnu packages gperf)
45 #:use-module (gnu packages gtk)
46 #:use-module (gnu packages icu4c)
47 #:use-module (gnu packages image)
48 #:use-module (gnu packages libevent)
49 #:use-module (gnu packages libffi)
50 #:use-module (gnu packages linux)
f613d459 51 #:use-module (gnu packages llvm)
f1e9de4d
MB
52 #:use-module (gnu packages kerberos)
53 #:use-module (gnu packages ninja)
54 #:use-module (gnu packages node)
aff0cce9 55 #:use-module (gnu packages nss)
f1e9de4d
MB
56 #:use-module (gnu packages pciutils)
57 #:use-module (gnu packages pkg-config)
58 #:use-module (gnu packages pulseaudio)
59 #:use-module (gnu packages python)
60 #:use-module (gnu packages python-web)
61 #:use-module (gnu packages python-xyz)
62 #:use-module (gnu packages regex)
63 #:use-module (gnu packages serialization)
64 #:use-module (gnu packages speech)
65 #:use-module (gnu packages tls)
66 #:use-module (gnu packages valgrind)
67 #:use-module (gnu packages vulkan)
68 #:use-module (gnu packages video)
69 #:use-module (gnu packages xiph)
70 #:use-module (gnu packages xml)
71 #:use-module (gnu packages xdisorg)
4cac5579 72 #:use-module (gnu packages xorg)
25590118
MB
73 #:use-module (ice-9 match)
74 #:use-module (srfi srfi-1))
f1e9de4d
MB
75
76(define %preserved-third-party-files
7f2e8522 77 '("base/third_party/cityhash" ;Expat
ba261f63 78 "base/third_party/double_conversion" ;BSD-3
f1e9de4d
MB
79 "base/third_party/dynamic_annotations" ;BSD-2
80 "base/third_party/icu" ;Unicode, X11-style
81 "base/third_party/superfasthash" ;BSD-3
82 "base/third_party/symbolize" ;BSD-3
83 "base/third_party/xdg_mime" ;LGPL2.0+ or Academic 2.0
84 "base/third_party/xdg_user_dirs" ;Expat
85 "chrome/third_party/mozilla_security_manager" ;MPL-1.1/GPL2+/LGPL2.1+
86 "courgette/third_party/bsdiff" ;BSD-2, BSD protection license
87 "courgette/third_party/divsufsort" ;Expat
f1e9de4d
MB
88 "net/third_party/mozilla_security_manager" ;MPL-1.1/GPL2+/LGPL2.1+
89 "net/third_party/nss" ;MPL-2.0
7f2e8522 90 "net/third_party/quiche" ;BSD-3
f1e9de4d
MB
91 "net/third_party/uri_template" ;ASL2.0
92 "third_party/abseil-cpp" ;ASL2.0
93 "third_party/adobe/flash/flapper_version.h" ;no license, trivial
94 "third_party/angle" ;BSD-3
95 "third_party/angle/src/common/third_party/base" ;BSD-3
96 "third_party/angle/src/common/third_party/smhasher" ;Public domain
97 "third_party/angle/src/common/third_party/xxhash" ;BSD-2
98 "third_party/angle/src/third_party/compiler" ;BSD-2
99 "third_party/angle/src/third_party/libXNVCtrl" ;Expat
100 "third_party/angle/src/third_party/trace_event" ;BSD-3
f1e9de4d
MB
101 "third_party/angle/third_party/vulkan-headers" ;ASL2.0
102 "third_party/angle/third_party/vulkan-loader" ;ASL2.0
103 "third_party/angle/third_party/vulkan-tools" ;ASL2.0
104 "third_party/angle/third_party/vulkan-validation-layers" ;ASL2.0
105 "third_party/apple_apsl" ;APSL2.0
136eeb0b 106 "third_party/axe-core" ;MPL2.0
f1e9de4d
MB
107 "third_party/blink" ;BSD-3, LGPL2+
108 "third_party/boringssl" ;OpenSSL/ISC (Google additions are ISC)
109 "third_party/boringssl/src/third_party/fiat" ;Expat
110 "third_party/breakpad" ;BSD-3
111 "third_party/brotli" ;Expat
112 "third_party/cacheinvalidation" ;ASL2.0
113 "third_party/catapult" ;BSD-3
114 "third_party/catapult/common/py_vulcanize/third_party/rcssmin" ;ASL2.0
115 "third_party/catapult/common/py_vulcanize/third_party/rjsmin" ;ASL2.0
116 "third_party/catapult/third_party/polymer" ;BSD-3
f613d459 117 ;; XXX: This is a minified version of <https://d3js.org/>.
f1e9de4d
MB
118 "third_party/catapult/tracing/third_party/d3" ;BSD-3
119 "third_party/catapult/tracing/third_party/gl-matrix" ;Expat
f613d459 120 ;; XXX: Minified version of <https://github.com/Stuk/jszip>.
f1e9de4d
MB
121 "third_party/catapult/tracing/third_party/jszip" ;Expat or GPL3
122 "third_party/catapult/tracing/third_party/mannwhitneyu" ;Expat
123 "third_party/catapult/tracing/third_party/oboe" ;BSD-2
f613d459 124 ;; XXX: Minified version of <https://github.com/nodeca/pako>.
f1e9de4d
MB
125 "third_party/catapult/tracing/third_party/pako" ;Expat
126 "third_party/ced" ;BSD-3
127 "third_party/cld_3" ;ASL2.0
ba261f63 128 "third_party/closure_compiler" ;ASL2.0
f1e9de4d 129 "third_party/crashpad" ;ASL2.0
136eeb0b 130 "third_party/crashpad/crashpad/third_party/lss" ;ASL2.0
f1e9de4d
MB
131 "third_party/crashpad/crashpad/third_party/zlib/zlib_crashpad.h" ;Zlib
132 "third_party/crc32c" ;BSD-3
133 "third_party/cros_system_api" ;BSD-3
af74e435 134 "third_party/dav1d" ;BSD-2
136eeb0b 135 "third_party/dawn" ;ASL2.0
ba261f63 136 "third_party/depot_tools/owners.py" ;BSD-3
f613d459 137 "third_party/devtools-frontend" ;BSD-3
d64584cf
MB
138 "third_party/devtools-frontend/src/third_party/axe-core" ;MPL2.0
139 "third_party/devtools-frontend/src/third_party/pyjson5" ;ASL2.0
f1e9de4d 140 "third_party/dom_distiller_js" ;BSD-3
af74e435 141 "third_party/emoji-segmenter" ;ASL2.0
f1e9de4d 142 "third_party/flatbuffers" ;ASL2.0
af74e435 143 "third_party/glslang" ;BSD-3, Expat, ASL2.0
f1e9de4d
MB
144 "third_party/google_input_tools" ;ASL2.0
145 "third_party/google_input_tools/third_party/closure_library" ;ASL2.0
146 "third_party/google_input_tools/third_party/closure_library/third_party/closure" ;Expat
147 "third_party/googletest" ;BSD-3
148 "third_party/hunspell" ;MPL1.1/GPL2+/LGPL2.1+
149 "third_party/iccjpeg" ;IJG
150 "third_party/inspector_protocol" ;BSD-3
151 "third_party/jinja2" ;BSD-3
152 "third_party/jstemplate" ;ASL2.0
153 "third_party/khronos" ;Expat, SGI
154 "third_party/leveldatabase" ;BSD-3
155 "third_party/libXNVCtrl" ;Expat
156 "third_party/libaddressinput" ;ASL2.0
157 "third_party/libaom" ;BSD-2 or "Alliance for Open Media Patent License 1.0"
158 "third_party/libaom/source/libaom/third_party/vector" ;Expat
159 "third_party/libaom/source/libaom/third_party/x86inc" ;ISC
f613d459 160 "third_party/libgifcodec" ;MPL1.1/GPL2+/LGPL2.1+, BSD-3, BSD-2
f1e9de4d
MB
161 "third_party/libjingle_xmpp" ;BSD-3
162 "third_party/libphonenumber" ;ASL2.0
163 "third_party/libsecret" ;LGPL2.1+
164 "third_party/libsrtp" ;BSD-3
165 "third_party/libsync" ;ASL2.0
166 "third_party/libudev" ;LGPL2.1+
167 "third_party/libwebm" ;BSD-3
168 "third_party/libxml/chromium" ;BSD-3
169 "third_party/libyuv" ;BSD-3
170 "third_party/lss" ;BSD-3
171 "third_party/markupsafe" ;BSD-3
172 "third_party/mesa_headers" ;Expat, SGI
173 "third_party/metrics_proto" ;BSD-3
174 "third_party/modp_b64" ;BSD-3
175 "third_party/nasm" ;BSD-2
176 "third_party/node" ;Expat
177 "third_party/node/node_modules/polymer-bundler/lib/third_party/UglifyJS2" ;BSD-2
ba261f63 178 "third_party/one_euro_filter" ;BSD-3
7f2e8522 179 "third_party/openscreen" ;BSD-3
ba261f63 180 "third_party/openscreen/src/third_party/tinycbor" ;Expat
f1e9de4d
MB
181 "third_party/ots" ;BSD-3
182 "third_party/pdfium" ;BSD-3
183 "third_party/pdfium/third_party/agg23" ;Expat
184 "third_party/pdfium/third_party/base" ;BSD-3
185 "third_party/pdfium/third_party/bigint" ;Public domain, BSD-3
186 "third_party/pdfium/third_party/skia_shared" ;BSD-3
187 "third_party/pdfium/third_party/freetype/include/pstables.h" ;FreeType
d64584cf 188 "third_party/perfetto" ;ASL2.0
136eeb0b 189 "third_party/pffft" ;the "FFTPACK" license, similar to BSD-3
f1e9de4d
MB
190 "third_party/ply" ;BSD-3
191 "third_party/polymer" ;BSD-3
ba261f63 192 "third_party/private-join-and-compute" ;ASL2.0
f1e9de4d
MB
193 "third_party/protobuf" ;BSD-3
194 "third_party/protobuf/third_party/six" ;Expat
195 "third_party/pyjson5" ;ASL2.0
196 "third_party/qcms" ;Expat
197 "third_party/rnnoise" ;BSD-3
198 "third_party/s2cellid" ;ASL2.0
199 "third_party/sfntly" ;ASL2.0
200 "third_party/skia" ;BSD-3
7f2e8522 201 "third_party/skia/include/third_party/skcms" ;BSD-3
f1e9de4d 202 "third_party/skia/third_party/skcms" ;BSD-3
7f2e8522 203 "third_party/skia/third_party/vulkanmemoryallocator" ;BSD-3, Expat
f1e9de4d
MB
204 "third_party/smhasher" ;Expat, public domain
205 "third_party/speech-dispatcher" ;GPL2+
206 "third_party/spirv-headers" ;ASL2.0
207 "third_party/SPIRV-Tools" ;ASL2.0
208 "third_party/sqlite" ;Public domain
209 "third_party/ungoogled" ;BSD-3
210 "third_party/usb_ids" ;BSD-3
211 "third_party/usrsctp" ;BSD-2
82ccfb1d
MB
212 "third_party/wayland/wayland_scanner_wrapper.py" ;BSD-3
213 "third_party/wayland-protocols" ;Expat
f1e9de4d
MB
214 "third_party/web-animations-js" ;ASL2.0
215 "third_party/webdriver" ;ASL2.0
216 "third_party/webrtc" ;BSD-3
217 "third_party/webrtc/common_audio/third_party/fft4g" ;Non-copyleft
218 "third_party/webrtc/common_audio/third_party/spl_sqrt_floor" ;Public domain
219 "third_party/webrtc/modules/third_party/fft" ;Non-copyleft
220 "third_party/webrtc/modules/third_party/g711" ;Public domain
221 "third_party/webrtc/modules/third_party/g722" ;Public domain
222 "third_party/webrtc/rtc_base/third_party/base64" ;Non-copyleft
223 "third_party/webrtc/rtc_base/third_party/sigslot" ;Public domain
224 "third_party/widevine/cdm/widevine_cdm_version.h" ;BSD-3
225 "third_party/widevine/cdm/widevine_cdm_common.h" ;BSD-3
226 "third_party/woff2" ;ASL2.0
227 "third_party/xdg-utils" ;Expat
228 "third_party/yasm/run_yasm.py" ;BSD-2 or BSD-3
229 "third_party/zlib/google" ;BSD-3
230 "url/third_party/mozilla" ;BSD-3, MPL1.1/GPL2+/LGPL2.1+
105fa9fc 231 "v8/src/third_party/siphash" ;Public domain
f1e9de4d
MB
232 "v8/src/third_party/utf8-decoder" ;Expat
233 "v8/src/third_party/valgrind" ;BSD-4
234 "v8/third_party/inspector_protocol" ;BSD-3
235 "v8/third_party/v8/builtins")) ;PSFL
236
237(define* (computed-origin-method gexp-promise hash-algo hash
238 #:optional (name "source")
239 #:key (system (%current-system))
240 (guile (default-guile)))
241 "Return a derivation that executes the G-expression that results
242from forcing GEXP-PROMISE."
243 (mlet %store-monad ((guile (package->derivation guile system)))
244 (gexp->derivation (or name "computed-origin")
245 (force gexp-promise)
2a1ec7bc 246 #:graft? #f ;nothing to graft
f1e9de4d
MB
247 #:system system
248 #:guile-for-build guile)))
249
d46f9f83
MB
250(define %chromium-version "80.0.3987.132")
251(define %ungoogled-revision "7e68f18f1d16a132fe7d913a176daf79897eaa58")
f613d459 252(define %debian-revision "debian/80.0.3987.116-1")
88115539 253(define package-revision "0")
718540d2
MB
254(define %package-version (string-append %chromium-version "-"
255 package-revision "."
256 (string-take %ungoogled-revision 7)))
f1e9de4d 257
d0804ea0
MB
258(define %chromium-origin
259 (origin
260 (method url-fetch)
261 (uri (string-append "https://commondatastorage.googleapis.com"
262 "/chromium-browser-official/chromium-"
263 %chromium-version ".tar.xz"))
264 (sha256
265 (base32
d46f9f83 266 "00f2hpi2d0n15yw29dv3dli566cgi7qh55bfpziag9a6j02i401c"))))
d0804ea0
MB
267
268(define %ungoogled-origin
269 (origin
270 (method git-fetch)
d46f9f83 271 (uri (git-reference (url "https://github.com/Eloston/ungoogled-chromium")
d0804ea0
MB
272 (commit %ungoogled-revision)))
273 (file-name (git-file-name "ungoogled-chromium"
274 (string-take %ungoogled-revision 7)))
275 (sha256
276 (base32
d46f9f83 277 "196rr3nly42pzl2bap22vzw4d8x87yl3zy1wq2fla5z8iy4x8ym1"))))
d0804ea0
MB
278
279(define %debian-origin
280 (origin
281 (method git-fetch)
282 (uri (git-reference
283 (url "https://salsa.debian.org/chromium-team/chromium.git")
284 (commit %debian-revision)))
285 (file-name (git-file-name "debian-chromium-packaging"
4cac5579
MB
286 (match (string-split %debian-revision #\/)
287 ((_ revision) revision)
288 (_ (string-take %debian-revision 7)))))
d0804ea0
MB
289 (sha256
290 (base32
f613d459 291 "1cc5sp566dd8f2grgr770xwbxgxf58dk1w7q3s8pmv4js5h3pwq8"))))
7f2e8522 292
f1e9de4d 293;; This is a "computed" origin that does the following:
105fa9fc
MB
294;; *) Runs the Ungoogled scripts on a pristine Chromium tarball.
295;; *) Applies Debians Chromium patches, for their unbundling and GCC work.
296;; *) Prunes all third_party directories that are not explicitly preserved.
297;; *) Adjusts "GN" build files such that system libraries are preferred.
f1e9de4d 298(define ungoogled-chromium-source
d0804ea0
MB
299 (let ((chromium-source %chromium-origin)
300 (ungoogled-source %ungoogled-origin)
301 (debian-source %debian-origin))
f1e9de4d
MB
302 (origin
303 (method computed-origin-method)
718540d2 304 (file-name (string-append "ungoogled-chromium-" %package-version ".tar.xz"))
f1e9de4d
MB
305 (sha256 #f)
306 (uri
307 (delay
308 (with-imported-modules '((guix build utils))
309 #~(begin
105fa9fc
MB
310 (use-modules (guix build utils)
311 (ice-9 rdelim)
312 (srfi srfi-1)
313 (srfi srfi-26))
f1e9de4d
MB
314 (let ((chromium-dir (string-append "chromium-" #$%chromium-version))
315 (preserved-files (list #$@%preserved-third-party-files)))
316
317 (set-path-environment-variable
318 "PATH" '("bin")
319 (list #+(canonical-package patch)
320 #+(canonical-package xz)
321 #+(canonical-package tar)
322 #+python-2
323 #+python))
324
325 (copy-recursively #+ungoogled-source "/tmp/ungoogled")
326
327 (with-directory-excursion "/tmp/ungoogled"
328
f1e9de4d
MB
329 (format #t "Unpacking chromium tarball...~%")
330 (force-output)
331 (invoke "tar" "xf" #+chromium-source)
332
7f2e8522
MB
333 ;; Ungoogled-Chromium contains a forked subset of the Debian
334 ;; patches. Disable those, as we apply newer versions later.
335 (substitute* "patches/series"
a7d470e4 336 ((".*/debian/.*")
7f2e8522
MB
337 ""))
338
f1e9de4d
MB
339 (format #t "Ungooglifying...~%")
340 (force-output)
105fa9fc
MB
341 (invoke "python3" "utils/prune_binaries.py" chromium-dir
342 "pruning.list")
343 (invoke "python3" "utils/patches.py" "apply"
344 chromium-dir "patches")
345 (invoke "python3" "utils/domain_substitution.py" "apply" "-r"
346 "domain_regex.list" "-f" "domain_substitution.list"
f1e9de4d
MB
347 "-c" "/tmp/domainscache.tar.gz" chromium-dir)
348
349 (with-directory-excursion chromium-dir
105fa9fc 350
f613d459 351 (format #t "Applying Debian patches...~%")
105fa9fc
MB
352 (force-output)
353 (let* ((debian #+debian-source)
354 (patches (string-append debian "/debian/patches"))
7f2e8522 355 (series (string-append patches "/series")))
105fa9fc
MB
356 (with-input-from-file series
357 (lambda ()
358 (let loop ((line (read-line)))
359 (unless (eof-object? line)
360 (when (and (> (string-length line) 1)
a7d470e4 361 (not (string-prefix? "#" line))
105fa9fc
MB
362 ;; Skip the Debian-specific ones.
363 (not (string-prefix? "debianization/" line))
7f2e8522 364 (not (string-prefix? "buster/" line))
105fa9fc 365 (not (any (cute string-suffix? <> line)
ba261f63 366 ;; These conflict with Ungoogled.
105fa9fc
MB
367 '("widevine-buildflag.patch"
368 "signin.patch"
7f2e8522
MB
369 "third-party-cookies.patch"
370
ba261f63
MB
371 ;; Disable workarounds for the
372 ;; Chromium "-lite" tarball. We
373 ;; use the "full" version and don't
374 ;; need these patches.
375 "closure.patch"
376 "owners.patch"
377
7f2e8522
MB
378 ;; XXX: 'fixes/inspector.patch'
379 ;; makes v8 reuse the top-level
380 ;; third_party/inspector_protocol
381 ;; instead of its own bundled copy,
382 ;; but that does not work here for
383 ;; some reason. Ignore that patch
384 ;; and those that depend on it.
7f2e8522 385 "inspector.patch"))))
105fa9fc
MB
386 (invoke "patch" "--force" "-p1" "--input"
387 (string-append patches "/" line)
388 "--no-backup-if-mismatch"))
389 (loop (read-line)))))))
390
f1e9de4d
MB
391 (format #t "Pruning third party files...~%")
392 (force-output)
393 (apply invoke "python"
105fa9fc
MB
394 "build/linux/unbundle/remove_bundled_libraries.py"
395 "--do-remove" preserved-files)
f1e9de4d
MB
396
397 (format #t "Replacing GN files...~%")
398 (force-output)
399 (invoke "python3" "build/linux/unbundle/replace_gn_files.py"
400 "--system-libraries" "ffmpeg" "flac" "fontconfig"
401 "freetype" "harfbuzz-ng" "icu" "libdrm" "libevent"
402 "libjpeg" "libpng" "libvpx" "libwebp" "libxml"
403 "libxslt" "openh264" "opus" "re2" "snappy" "yasm"
404 "zlib"))
405
406 (format #t (string-append "Packing new ungoogled tarball ...~%"))
407 (force-output)
408 (invoke "tar" "cvfa" #$output
409 ;; Avoid non-determinism in the archive.
410 "--mtime=@0"
411 "--owner=root:0"
412 "--group=root:0"
413 "--sort=name"
414 chromium-dir)
415
416 #t)))))))))
417
418(define opus+custom
419 (package/inherit opus
420 (name "opus+custom")
421 (arguments
422 (substitute-keyword-arguments (package-arguments opus)
423 ((#:configure-flags flags ''())
424 ;; Opus Custom is an optional extension of the Opus
425 ;; specification that allows for unsupported frame
426 ;; sizes. Chromium requires that this is enabled.
427 `(cons "--enable-custom-modes"
428 ,flags))))))
429
430(define-public ungoogled-chromium
431 (package
432 (name "ungoogled-chromium")
718540d2 433 (version %package-version)
f1e9de4d
MB
434 (synopsis "Graphical web browser")
435 (source ungoogled-chromium-source)
436 (build-system gnu-build-system)
437 (arguments
438 `(#:tests? #f
f8157512 439 ;; FIXME: Chromiums RUNPATH lacks entries for some libraries.
f1e9de4d
MB
440 #:validate-runpath? #f
441 #:modules ((guix build gnu-build-system)
442 (guix build utils)
443 (ice-9 ftw)
444 (ice-9 regex)
445 (srfi srfi-26))
446 #:configure-flags
447 ;; See tools/gn/docs/cookbook.md and
448 ;; https://www.chromium.org/developers/gn-build-configuration
449 ;; for usage. Run "./gn args . --list" in the Release
450 ;; directory for an exhaustive list of supported flags.
451 ;; (Note: The 'configure' phase will do that for you.)
452 (list "is_debug=false"
f613d459 453 "is_cfi=false"
f1e9de4d
MB
454 "use_gold=false"
455 "use_lld=false"
f613d459 456 "clang_use_chrome_plugins=false"
f1e9de4d
MB
457 "linux_use_bundled_binutils=false"
458 "use_custom_libcxx=false"
459 "use_sysroot=false"
460 "enable_precompiled_headers=false"
461 "goma_dir=\"\""
462 "enable_nacl=false"
463 "enable_nacl_nonsfi=false"
464 "use_allocator=\"none\""
465 "use_unofficial_version_number=false"
466 "treat_warnings_as_errors=false"
467 "use_official_google_api_keys=false"
468 "fieldtrial_testing_like_official_build=true"
469 "safe_browsing_mode=0"
470 "enable_mdns=false"
471 "enable_one_click_signin=false"
472 "enable_reading_list=false"
473 "enable_remoting=false"
474 "enable_reporting=false"
475 "enable_service_discovery=false"
476 "enable_swiftshader=false"
136eeb0b 477 "enable_vr=false"
78a64543 478 "enable_widevine=false"
f1e9de4d
MB
479 ;; Disable type-checking for the Web UI to avoid a Java dependency.
480 "closure_compile=false"
481
482 ;; Define a custom toolchain that simply looks up CC, AR and
483 ;; friends from the environment.
484 "custom_toolchain=\"//build/toolchain/linux/unbundle:default\""
485 "host_toolchain=\"//build/toolchain/linux/unbundle:default\""
f1e9de4d
MB
486
487 ;; Prefer system libraries.
488 "use_system_freetype=true"
489 "use_system_harfbuzz=true"
490 "use_system_lcms2=true"
491 "use_system_libdrm=true"
492 "use_system_libjpeg=true"
ca86b0ba 493 "use_system_libopenjpeg2=true"
f1e9de4d
MB
494 "use_system_libpng=true"
495 "use_system_zlib=true"
496 "use_gnome_keyring=false" ;deprecated by libsecret
497 "use_openh264=true"
498 "use_pulseaudio=true"
499 "link_pulseaudio=true"
799aebd7
MB
500
501 ;; VA-API acceleration is currently only supported on x86_64-linux.
502 ,@(if (string-prefix? "x86_64" (or (%current-target-system)
503 (%current-system)))
504 '("use_vaapi=true")
505 '())
f1e9de4d 506
7f2e8522 507 ;; Do not artifically restrict formats supported by system ffmpeg.
f1e9de4d
MB
508 "proprietary_codecs=true"
509 "ffmpeg_branding=\"Chrome\""
510
511 ;; WebRTC stuff.
512 "rtc_use_h264=true"
513 ;; Don't use bundled sources.
514 "rtc_build_json=false"
515 "rtc_build_libevent=false"
516 "rtc_build_libvpx=false"
517 "rtc_build_opus=false"
518 "rtc_build_ssl=false"
519 "rtc_build_libsrtp=true" ;FIXME: fails to find headers
520 "rtc_build_usrsctp=true" ;TODO: package this
521 (string-append "rtc_jsoncpp_root=\""
522 (assoc-ref %build-inputs "jsoncpp")
523 "/include/jsoncpp/json\"")
524 (string-append "rtc_ssl_root=\""
525 (assoc-ref %build-inputs "openssl")
526 "/include/openssl\""))
527 #:phases
528 (modify-phases %standard-phases
529 (add-after 'unpack 'patch-stuff
f8157512 530 (lambda _
f1e9de4d
MB
531 (substitute*
532 '("base/process/launch_posix.cc"
533 "base/third_party/dynamic_annotations/dynamic_annotations.c"
534 "sandbox/linux/seccomp-bpf/sandbox_bpf.cc"
535 "sandbox/linux/services/credentials.cc"
536 "sandbox/linux/services/namespace_utils.cc"
537 "sandbox/linux/services/syscall_wrappers.cc"
538 "sandbox/linux/syscall_broker/broker_host.cc")
539 (("include \"base/third_party/valgrind/") "include \"valgrind/"))
540
541 (for-each (lambda (file)
542 (substitute* file
543 ;; Fix opus include path.
544 ;; Do not substitute opus_private.h.
545 (("#include \"opus\\.h\"")
546 "#include \"opus/opus.h\"")
547 (("#include \"opus_custom\\.h\"")
548 "#include \"opus/opus_custom.h\"")
549 (("#include \"opus_defines\\.h\"")
550 "#include \"opus/opus_defines.h\"")
551 (("#include \"opus_multistream\\.h\"")
552 "#include \"opus/opus_multistream.h\"")
553 (("#include \"opus_types\\.h\"")
554 "#include \"opus/opus_types.h\"")))
555 (find-files (string-append "third_party/webrtc/modules"
556 "/audio_coding/codecs/opus")))
557
558 (substitute* "chrome/common/chrome_paths.cc"
559 (("/usr/share/chromium/extensions")
560 ;; TODO: Add ~/.guix-profile.
561 "/run/current-system/profile/share/chromium/extensions"))
562
ba261f63
MB
563 ;; Many files try to include ICU headers from "third_party/icu/...".
564 ;; Remove the "third_party/" prefix to use system headers instead.
565 (substitute* (find-files "chrome" "\\.cc$")
566 (("third_party/icu/source/(common|i18n)/")
567 ""))
568
f1e9de4d 569 ;; XXX: Should be unnecessary when use_system_lcms2=true.
ba261f63 570 (substitute* "third_party/pdfium/core/fxcodec/icc/iccmodule.h"
f1e9de4d
MB
571 (("include \"third_party/lcms/include/lcms2\\.h\"")
572 "include \"lcms2.h\""))
573
574 (substitute*
575 "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h"
576 (("include \"third_party/curl") "include \"curl"))
577
578 (substitute* "third_party/webrtc/rtc_base/strings/json.h"
579 (("#include \"third_party/jsoncpp/") "#include \"json/"))
580
f613d459
MB
581 (substitute* "gpu/config/gpu_util.cc"
582 (("third_party/vulkan/include/")
583 ""))
584
7f2e8522 585 (substitute* '("components/viz/common/gpu/vulkan_context_provider.h"
105fa9fc 586 "components/viz/common/resources/resource_format_utils.h")
f1e9de4d
MB
587 (("third_party/vulkan/include/") ""))
588
105fa9fc 589 (substitute* "third_party/skia/include/gpu/vk/GrVkVulkan.h"
7f2e8522 590 (("include/third_party/vulkan/") ""))
105fa9fc 591
f1e9de4d
MB
592 ;; Building chromedriver embeds some files using the ZIP
593 ;; format which doesn't support timestamps before
594 ;; 1980. Therefore, advance the timestamps of the files
595 ;; which are included so that building chromedriver
596 ;; works.
597 (let ((circa-1980 (* 10 366 24 60 60)))
598 (for-each (lambda (file)
599 (utime file circa-1980 circa-1980))
600 '("chrome/test/chromedriver/extension/background.js"
601 "chrome/test/chromedriver/extension/manifest.json")))
602
603 #t))
f8157512
MB
604 (add-after 'patch-stuff 'add-absolute-references
605 (lambda* (#:key inputs #:allow-other-keys)
606 (let ((cups (assoc-ref inputs "cups"))
607 (nss (assoc-ref inputs "nss"))
608 (mesa (assoc-ref inputs "mesa"))
609 (udev (assoc-ref inputs "udev")))
610 (substitute* "printing/cups_config_helper.py"
611 (("cups_config =.*")
612 (string-append "cups_config = '" cups
613 "/bin/cups-config'\n")))
614 (substitute* "crypto/nss_util.cc"
615 (("libnssckbi\\.so")
616 (string-append nss "/lib/nss/libnssckbi.so")))
617 (substitute* "device/udev_linux/udev1_loader.cc"
618 (("libudev\\.so\\.1")
619 (string-append udev "/lib/libudev.so.1")))
620 (substitute*
621 '("ui/ozone/platform/x11/gl_ozone_glx.cc"
622 "ui/ozone/common/egl_util.cc"
623 "ui/gl/init/gl_initializer_x11.cc"
624 "third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp")
625 (("libGL\\.so\\.1")
626 (string-append mesa "/lib/libGL.so.1"))
627 (("libEGL\\.so\\.1")
628 (string-append mesa "/lib/libEGL.so.1"))
629 (("libGLESv2\\.so\\.2")
630 (string-append mesa "/lib/libGLESv2.so.2")))
631 #t)))
f1e9de4d
MB
632 (add-before 'configure 'prepare-build-environment
633 (lambda* (#:key inputs #:allow-other-keys)
634
635 ;; Make sure the right build tools are used.
636 (setenv "AR" "ar") (setenv "NM" "nm")
f613d459 637 (setenv "CC" "clang") (setenv "CXX" "clang++")
f1e9de4d 638
f613d459 639 ;; Do not optimize away null pointer safety checks.
7f2e8522
MB
640 (setenv "CXXFLAGS" "-fno-delete-null-pointer-checks")
641
f1e9de4d
MB
642 ;; TODO: pre-compile instead. Avoids a race condition.
643 (setenv "PYTHONDONTWRITEBYTECODE" "1")
644
f613d459
MB
645 (substitute*
646 ;; From Debians 'system/node.patch'.
647 "third_party/devtools-frontend/src/scripts/devtools_paths.py"
648 (("/usr/bin/nodejs") (which "node")))
649
f1e9de4d
MB
650 ;; XXX: How portable is this.
651 (mkdir-p "third_party/node/linux/node-linux-x64")
652 (symlink (string-append (assoc-ref inputs "node") "/bin")
653 "third_party/node/linux/node-linux-x64/bin")
654
655 #t))
656 (replace 'configure
657 (lambda* (#:key configure-flags #:allow-other-keys)
658 (let ((args (string-join configure-flags " ")))
659 ;; Generate ninja build files.
660 (invoke "gn" "gen" "out/Release"
661 (string-append "--args=" args))
662
663 ;; Print the full list of supported arguments as well as
664 ;; their current status for convenience.
665 (format #t "Dumping configure flags...\n")
666 (invoke "gn" "args" "out/Release" "--list"))))
664fa4b1
MB
667 (add-before 'build 'increase-resource-limits
668 (lambda _
ba261f63
MB
669 ;; XXX: Chromiums linking step requires a lot of simultaneous file
670 ;; accesses. Having a too low ulimit will result in bogus linker
671 ;; errors such as "foo.a: error adding symbols: malformed archive".
672
07b10725 673 ;; Try increasing the soft resource limit of max open files to 2048,
ba261f63
MB
674 ;; or equal to the hard limit, whichever is lower.
675 (call-with-values (lambda () (getrlimit 'nofile))
676 (lambda (soft hard)
07b10725 677 (when (and soft (< soft 2048))
ba261f63 678 (if hard
07b10725
MB
679 (setrlimit 'nofile (min hard 2048) hard)
680 (setrlimit 'nofile 2048 #f))
ba261f63
MB
681 (format #t
682 "increased maximum number of open files from ~d to ~d~%"
07b10725 683 soft (if hard (min hard 2048) 2048)))))
664fa4b1
MB
684 #t))
685 (replace 'build
686 (lambda* (#:key (parallel-build? #t) #:allow-other-keys)
f1e9de4d 687 (invoke "ninja" "-C" "out/Release"
9a2e5fe5
MB
688 "-j" (if parallel-build?
689 (number->string (parallel-job-count))
690 "1")
f1e9de4d
MB
691 "chrome"
692 "chromedriver")))
693 (replace 'install
694 (lambda* (#:key inputs outputs #:allow-other-keys)
695 (let* ((out (assoc-ref outputs "out"))
696 (bin (string-append out "/bin"))
697 (exe (string-append bin "/chromium"))
698 (lib (string-append out "/lib"))
699 (man (string-append out "/share/man/man1"))
700 (applications (string-append out "/share/applications"))
701 (install-regexp (make-regexp "\\.(bin|pak)$"))
702 (locales (string-append lib "/locales"))
703 (resources (string-append lib "/resources"))
704 (preferences (assoc-ref inputs "master-preferences"))
705 (gtk+ (assoc-ref inputs "gtk+"))
f1e9de4d
MB
706 (sh (which "sh")))
707
708 (substitute* '("chrome/app/resources/manpage.1.in"
709 "chrome/installer/linux/common/desktop.template")
710 (("@@MENUNAME@@") "Chromium")
711 (("@@PACKAGE@@") "chromium")
712 (("/usr/bin/@@USR_BIN_SYMLINK_NAME@@") exe))
713
714 (mkdir-p man)
715 (copy-file "chrome/app/resources/manpage.1.in"
716 (string-append man "/chromium.1"))
717
718 (mkdir-p applications)
719 (copy-file "chrome/installer/linux/common/desktop.template"
720 (string-append applications "/chromium.desktop"))
721
722 (mkdir-p lib)
723 (copy-file preferences (string-append lib "/master_preferences"))
724
725 (with-directory-excursion "out/Release"
726 (for-each (lambda (file)
727 (install-file file lib))
728 (scandir "." (cut regexp-exec install-regexp <>)))
729 (copy-file "chrome" (string-append lib "/chromium"))
730
f1e9de4d
MB
731 (copy-recursively "locales" locales)
732 (copy-recursively "resources" resources)
733
734 (mkdir-p bin)
735 (symlink "../lib/chromium" exe)
736 (install-file "chromedriver" bin)
737
738 (wrap-program exe
f1e9de4d 739 ;; Avoid file manager crash. See <https://bugs.gnu.org/26593>.
3df7b15e
AG
740 `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share")))))
741
742 (with-directory-excursion "chrome/app/theme/chromium"
743 (for-each
744 (lambda (size)
745 (let ((icons (string-append out "/share/icons/hicolor/"
746 size "x" size "/apps")))
747 (mkdir-p icons)
748 (copy-file (string-append "product_logo_" size ".png")
749 (string-append icons "/chromium.png"))))
ba261f63 750 '("24" "48" "64" "128" "256")))
3df7b15e 751 #t))))))
f1e9de4d
MB
752 (native-inputs
753 `(("bison" ,bison)
f613d459 754 ("clang" ,clang-9)
f1e9de4d
MB
755 ("gn" ,gn)
756 ("gperf" ,gperf)
757 ("ninja" ,ninja)
758 ("node" ,node)
759 ("pkg-config" ,pkg-config)
760 ("which" ,which)
761 ("yasm" ,yasm)
762
763 ;; This file contains defaults for new user profiles.
764 ("master-preferences" ,(local-file "aux-files/chromium/master-preferences.json"))
765
766 ("python-beautifulsoup4" ,python2-beautifulsoup4)
767 ("python-html5lib" ,python2-html5lib)
768 ("python" ,python-2)))
769 (inputs
770 `(("alsa-lib" ,alsa-lib)
771 ("atk" ,atk)
772 ("cups" ,cups)
773 ("curl" ,curl)
774 ("dbus" ,dbus)
775 ("dbus-glib" ,dbus-glib)
776 ("expat" ,expat)
777 ("flac" ,flac)
778 ("ffmpeg" ,ffmpeg)
779 ("fontconfig" ,fontconfig)
780 ("freetype" ,freetype)
781 ("gdk-pixbuf" ,gdk-pixbuf)
782 ("glib" ,glib)
783 ("gtk+" ,gtk+)
784 ("harfbuzz" ,harfbuzz)
fb82d347 785 ("icu4c" ,icu4c)
f1e9de4d
MB
786 ("jsoncpp" ,jsoncpp)
787 ("lcms" ,lcms)
788 ("libevent" ,libevent)
789 ("libffi" ,libffi)
790 ("libjpeg-turbo" ,libjpeg-turbo)
791 ("libpng" ,libpng)
792 ("libva" ,libva)
a7d470e4 793 ("libvpx" ,libvpx)
f1e9de4d
MB
794 ("libwebp" ,libwebp)
795 ("libx11" ,libx11)
796 ("libxcb" ,libxcb)
797 ("libxcomposite" ,libxcomposite)
798 ("libxcursor" ,libxcursor)
799 ("libxdamage" ,libxdamage)
800 ("libxext" ,libxext)
801 ("libxfixes" ,libxfixes)
802 ("libxi" ,libxi)
803 ("libxml2" ,libxml2)
804 ("libxrandr" ,libxrandr)
805 ("libxrender" ,libxrender)
806 ("libxscrnsaver" ,libxscrnsaver)
807 ("libxslt" ,libxslt)
808 ("libxtst" ,libxtst)
809 ("mesa" ,mesa)
810 ("minizip" ,minizip)
811 ("mit-krb5" ,mit-krb5)
812 ("nss" ,nss)
813 ("openh264" ,openh264)
814 ("openjpeg" ,openjpeg) ;PDFium only
815 ("openssl" ,openssl)
816 ("opus" ,opus+custom)
817 ("pango" ,pango)
818 ("pciutils" ,pciutils)
819 ("pulseaudio" ,pulseaudio)
820 ("re2" ,re2)
821 ("snappy" ,snappy)
822 ("speech-dispatcher" ,speech-dispatcher)
823 ("udev" ,eudev)
824 ("valgrind" ,valgrind)
825 ("vulkan-headers" ,vulkan-headers)))
c94cc6de 826
760d90cc
MB
827 ;; Building Chromium takes ... a very long time. On a single core, a busy
828 ;; mid-end x86 system may need more than 24 hours to complete the build.
a009a3ee
MB
829 (properties '((timeout . 144000) ;40 hours
830 ;; The linking step may take more than an hour on some hardware.
831 (max-silent-time . 7200)))
c94cc6de 832
f1e9de4d
MB
833 (home-page "https://github.com/Eloston/ungoogled-chromium")
834 (description
835 "Ungoogled-Chromium is the Chromium web browser, with some functionality
836disabled in order to protect the users privacy.")
837 ;; Chromium is developed as BSD-3, but bundles a large number of third-party
838 ;; components with other licenses. For full information, see chrome://credits.
839 (license (list license:bsd-3
840 license:bsd-2
841 license:expat
842 license:asl2.0
843 license:mpl1.1
844 license:mpl2.0
845 license:public-domain
846 license:isc
847 (license:non-copyleft "chrome://credits"
848 "See chrome://credits for more information.")
849 license:lgpl2.1+))))
82ccfb1d
MB
850
851(define-public ungoogled-chromium/wayland
852 (package/inherit ungoogled-chromium
853 (name "ungoogled-chromium-wayland")
854 (inputs
855 `(("wayland" ,wayland)
856 ("wayland-protocols" ,wayland-protocols)
ba261f63 857 ,@(package-inputs ungoogled-chromium)))
82ccfb1d
MB
858 (arguments
859 (substitute-keyword-arguments (package-arguments ungoogled-chromium)
bfce33cd
MB
860 ((#:phases phases)
861 `(modify-phases ,phases
862 (add-after 'unpack 'add-ozone-patch
863 (lambda _
864 ;; Add missing include statement required when using libstdc++,
865 ;; Clang and Ozone. Fixed in M81.
866 (substitute* "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc"
867 (("#include \"base/logging\\.h" all)
868 (string-append "#include <algorithm>\n" all)))
869 #t))))
82ccfb1d
MB
870 ((#:configure-flags flags)
871 `(append (list "use_ozone=true"
872 "ozone_platform_wayland=true"
873 "ozone_auto_platforms=false"
a7d470e4 874 "ozone_platform=\"wayland\""
82ccfb1d
MB
875 "use_xkbcommon=true"
876 "use_system_minigbm=true"
877 "use_system_libwayland=true"
878 (string-append "system_wayland_scanner_path=\""
879 (assoc-ref %build-inputs "wayland")
880 "/bin/wayland-scanner\""))
881 (delete "use_vaapi=true" ,flags)))))))