Merge branch 'master' into core-updates
[jackhill/guix/guix.git] / gnu / packages / chromium.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2019, 2020 Marius Bakke <mbakke@fastmail.com>
3 ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
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)
39 #:use-module (gnu packages freedesktop)
40 #:use-module (gnu packages ghostscript)
41 #:use-module (gnu packages gl)
42 #:use-module (gnu packages glib)
43 #:use-module (gnu packages gnome)
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)
51 #:use-module (gnu packages llvm)
52 #:use-module (gnu packages kerberos)
53 #:use-module (gnu packages ninja)
54 #:use-module (gnu packages node)
55 #:use-module (gnu packages nss)
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)
72 #:use-module (gnu packages xorg)
73 #:use-module (ice-9 match)
74 #:use-module (srfi srfi-1))
75
76 (define %preserved-third-party-files
77 '("base/third_party/cityhash" ;Expat
78 "base/third_party/double_conversion" ;BSD-3
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
88 "net/third_party/mozilla_security_manager" ;MPL-1.1/GPL2+/LGPL2.1+
89 "net/third_party/nss" ;MPL-2.0
90 "net/third_party/quiche" ;BSD-3
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
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
106 "third_party/axe-core" ;MPL2.0
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
117 ;; XXX: This is a minified version of <https://d3js.org/>.
118 "third_party/catapult/tracing/third_party/d3" ;BSD-3
119 "third_party/catapult/tracing/third_party/gl-matrix" ;Expat
120 ;; XXX: Minified version of <https://github.com/Stuk/jszip>.
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
124 ;; XXX: Minified version of <https://github.com/nodeca/pako>.
125 "third_party/catapult/tracing/third_party/pako" ;Expat
126 "third_party/ced" ;BSD-3
127 "third_party/cld_3" ;ASL2.0
128 "third_party/closure_compiler" ;ASL2.0
129 "third_party/crashpad" ;ASL2.0
130 "third_party/crashpad/crashpad/third_party/lss" ;ASL2.0
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
134 "third_party/dav1d" ;BSD-2
135 "third_party/dawn" ;ASL2.0
136 "third_party/depot_tools/owners.py" ;BSD-3
137 "third_party/devtools-frontend" ;BSD-3
138 "third_party/devtools-frontend/src/third_party/axe-core" ;MPL2.0
139 "third_party/devtools-frontend/src/third_party/pyjson5" ;ASL2.0
140 "third_party/dom_distiller_js" ;BSD-3
141 "third_party/emoji-segmenter" ;ASL2.0
142 "third_party/flatbuffers" ;ASL2.0
143 "third_party/glslang" ;BSD-3, Expat, ASL2.0
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
160 "third_party/libgifcodec" ;MPL1.1/GPL2+/LGPL2.1+, BSD-3, BSD-2
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
178 "third_party/one_euro_filter" ;BSD-3
179 "third_party/openscreen" ;BSD-3
180 "third_party/openscreen/src/third_party/tinycbor" ;Expat
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
188 "third_party/perfetto" ;ASL2.0
189 "third_party/pffft" ;the "FFTPACK" license, similar to BSD-3
190 "third_party/ply" ;BSD-3
191 "third_party/polymer" ;BSD-3
192 "third_party/private-join-and-compute" ;ASL2.0
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
201 "third_party/skia/include/third_party/skcms" ;BSD-3
202 "third_party/skia/third_party/skcms" ;BSD-3
203 "third_party/skia/third_party/vulkanmemoryallocator" ;BSD-3, Expat
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
212 "third_party/wayland/wayland_scanner_wrapper.py" ;BSD-3
213 "third_party/wayland-protocols" ;Expat
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+
231 "v8/src/third_party/siphash" ;Public domain
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
242 from forcing GEXP-PROMISE."
243 (mlet %store-monad ((guile (package->derivation guile system)))
244 (gexp->derivation (or name "computed-origin")
245 (force gexp-promise)
246 #:graft? #f ;nothing to graft
247 #:system system
248 #:guile-for-build guile)))
249
250 (define %chromium-version "80.0.3987.132")
251 (define %ungoogled-revision "7e68f18f1d16a132fe7d913a176daf79897eaa58")
252 (define %debian-revision "debian/80.0.3987.116-1")
253 (define package-revision "0")
254 (define %package-version (string-append %chromium-version "-"
255 package-revision "."
256 (string-take %ungoogled-revision 7)))
257
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
266 "00f2hpi2d0n15yw29dv3dli566cgi7qh55bfpziag9a6j02i401c"))))
267
268 (define %ungoogled-origin
269 (origin
270 (method git-fetch)
271 (uri (git-reference (url "https://github.com/Eloston/ungoogled-chromium")
272 (commit %ungoogled-revision)))
273 (file-name (git-file-name "ungoogled-chromium"
274 (string-take %ungoogled-revision 7)))
275 (sha256
276 (base32
277 "196rr3nly42pzl2bap22vzw4d8x87yl3zy1wq2fla5z8iy4x8ym1"))))
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"
286 (match (string-split %debian-revision #\/)
287 ((_ revision) revision)
288 (_ (string-take %debian-revision 7)))))
289 (sha256
290 (base32
291 "1cc5sp566dd8f2grgr770xwbxgxf58dk1w7q3s8pmv4js5h3pwq8"))))
292
293 ;; This is a "computed" origin that does the following:
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.
298 (define ungoogled-chromium-source
299 (let ((chromium-source %chromium-origin)
300 (ungoogled-source %ungoogled-origin)
301 (debian-source %debian-origin))
302 (origin
303 (method computed-origin-method)
304 (file-name (string-append "ungoogled-chromium-" %package-version ".tar.xz"))
305 (sha256 #f)
306 (uri
307 (delay
308 (with-imported-modules '((guix build utils))
309 #~(begin
310 (use-modules (guix build utils)
311 (ice-9 rdelim)
312 (srfi srfi-1)
313 (srfi srfi-26))
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
329 (format #t "Unpacking chromium tarball...~%")
330 (force-output)
331 (invoke "tar" "xf" #+chromium-source)
332
333 ;; Ungoogled-Chromium contains a forked subset of the Debian
334 ;; patches. Disable those, as we apply newer versions later.
335 (substitute* "patches/series"
336 ((".*/debian/.*")
337 ""))
338
339 (format #t "Ungooglifying...~%")
340 (force-output)
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"
347 "-c" "/tmp/domainscache.tar.gz" chromium-dir)
348
349 (with-directory-excursion chromium-dir
350
351 (format #t "Applying Debian patches...~%")
352 (force-output)
353 (let* ((debian #+debian-source)
354 (patches (string-append debian "/debian/patches"))
355 (series (string-append patches "/series")))
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)
361 (not (string-prefix? "#" line))
362 ;; Skip the Debian-specific ones.
363 (not (string-prefix? "debianization/" line))
364 (not (string-prefix? "buster/" line))
365 (not (any (cute string-suffix? <> line)
366 ;; These conflict with Ungoogled.
367 '("widevine-buildflag.patch"
368 "signin.patch"
369 "third-party-cookies.patch"
370
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
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.
385 "inspector.patch"))))
386 (invoke "patch" "--force" "-p1" "--input"
387 (string-append patches "/" line)
388 "--no-backup-if-mismatch"))
389 (loop (read-line)))))))
390
391 (format #t "Pruning third party files...~%")
392 (force-output)
393 (apply invoke "python"
394 "build/linux/unbundle/remove_bundled_libraries.py"
395 "--do-remove" preserved-files)
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")
433 (version %package-version)
434 (synopsis "Graphical web browser")
435 (source ungoogled-chromium-source)
436 (build-system gnu-build-system)
437 (arguments
438 `(#:tests? #f
439 ;; FIXME: Chromiums RUNPATH lacks entries for some libraries.
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"
453 "is_cfi=false"
454 "use_gold=false"
455 "use_lld=false"
456 "clang_use_chrome_plugins=false"
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"
477 "enable_vr=false"
478 "enable_widevine=false"
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\""
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"
493 "use_system_libopenjpeg2=true"
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"
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 '())
506
507 ;; Do not artifically restrict formats supported by system ffmpeg.
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
530 (lambda _
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
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
569 ;; XXX: Should be unnecessary when use_system_lcms2=true.
570 (substitute* "third_party/pdfium/core/fxcodec/icc/iccmodule.h"
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
581 (substitute* "gpu/config/gpu_util.cc"
582 (("third_party/vulkan/include/")
583 ""))
584
585 (substitute* '("components/viz/common/gpu/vulkan_context_provider.h"
586 "components/viz/common/resources/resource_format_utils.h")
587 (("third_party/vulkan/include/") ""))
588
589 (substitute* "third_party/skia/include/gpu/vk/GrVkVulkan.h"
590 (("include/third_party/vulkan/") ""))
591
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))
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)))
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")
637 (setenv "CC" "clang") (setenv "CXX" "clang++")
638
639 ;; Do not optimize away null pointer safety checks.
640 (setenv "CXXFLAGS" "-fno-delete-null-pointer-checks")
641
642 ;; TODO: pre-compile instead. Avoids a race condition.
643 (setenv "PYTHONDONTWRITEBYTECODE" "1")
644
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
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"))))
667 (add-before 'build 'increase-resource-limits
668 (lambda _
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
673 ;; Try increasing the soft resource limit of max open files to 2048,
674 ;; or equal to the hard limit, whichever is lower.
675 (call-with-values (lambda () (getrlimit 'nofile))
676 (lambda (soft hard)
677 (when (and soft (< soft 2048))
678 (if hard
679 (setrlimit 'nofile (min hard 2048) hard)
680 (setrlimit 'nofile 2048 #f))
681 (format #t
682 "increased maximum number of open files from ~d to ~d~%"
683 soft (if hard (min hard 2048) 2048)))))
684 #t))
685 (replace 'build
686 (lambda* (#:key (parallel-build? #t) #:allow-other-keys)
687 (invoke "ninja" "-C" "out/Release"
688 "-j" (if parallel-build?
689 (number->string (parallel-job-count))
690 "1")
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+"))
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
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
739 ;; Avoid file manager crash. See <https://bugs.gnu.org/26593>.
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"))))
750 '("24" "48" "64" "128" "256")))
751 #t))))))
752 (native-inputs
753 `(("bison" ,bison)
754 ("clang" ,clang-9)
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)
785 ("icu4c" ,icu4c)
786 ("jsoncpp" ,jsoncpp)
787 ("lcms" ,lcms)
788 ("libevent" ,libevent)
789 ("libffi" ,libffi)
790 ("libjpeg-turbo" ,libjpeg-turbo)
791 ("libpng" ,libpng)
792 ("libva" ,libva)
793 ("libvpx" ,libvpx)
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)))
826
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.
829 (properties '((timeout . 144000) ;40 hours
830 ;; The linking step may take more than an hour on some hardware.
831 (max-silent-time . 7200)))
832
833 (home-page "https://github.com/Eloston/ungoogled-chromium")
834 (description
835 "Ungoogled-Chromium is the Chromium web browser, with some functionality
836 disabled 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+))))
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)
857 ,@(package-inputs ungoogled-chromium)))
858 (arguments
859 (substitute-keyword-arguments (package-arguments ungoogled-chromium)
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))))
870 ((#:configure-flags flags)
871 `(append (list "use_ozone=true"
872 "ozone_platform_wayland=true"
873 "ozone_auto_platforms=false"
874 "ozone_platform=\"wayland\""
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)))))))