gnu: jami: Update to 20210326.1.cfba013 and rename to jami-gnome.
[jackhill/guix/guix.git] / gnu / packages / jami.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2019 Pierre Neidhardt <mail@ambrevar.xyz>
3 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
4 ;;; Copyright © 2019, 2020 Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
5 ;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
6 ;;;
7 ;;; This file is part of GNU Guix.
8 ;;;
9 ;;; GNU Guix is free software; you can redistribute it and/or modify it
10 ;;; under the terms of the GNU General Public License as published by
11 ;;; the Free Software Foundation; either version 3 of the License, or (at
12 ;;; your option) any later version.
13 ;;;
14 ;;; GNU Guix is distributed in the hope that it will be useful, but
15 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;;; GNU General Public License for more details.
18 ;;;
19 ;;; You should have received a copy of the GNU General Public License
20 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
21
22 (define-module (gnu packages jami)
23 #:use-module ((guix licenses) #:prefix license:)
24 #:use-module (gnu packages aidc)
25 #:use-module (gnu packages audio)
26 #:use-module (gnu packages autotools)
27 #:use-module (gnu packages backup)
28 #:use-module (gnu packages base)
29 #:use-module (gnu packages crypto)
30 #:use-module (gnu packages documentation)
31 #:use-module (gnu packages freedesktop)
32 #:use-module (gnu packages gcc)
33 #:use-module (gnu packages gettext)
34 #:use-module (gnu packages glib)
35 #:use-module (gnu packages gnome)
36 #:use-module (gnu packages gtk)
37 #:use-module (gnu packages libcanberra)
38 #:use-module (gnu packages linux)
39 #:use-module (gnu packages networking)
40 #:use-module (gnu packages perl)
41 #:use-module (gnu packages pkg-config)
42 #:use-module (gnu packages pulseaudio)
43 #:use-module (gnu packages python)
44 #:use-module (gnu packages qt)
45 #:use-module (gnu packages serialization)
46 #:use-module (gnu packages sqlite)
47 #:use-module (gnu packages telephony)
48 #:use-module (gnu packages tls)
49 #:use-module (gnu packages upnp)
50 #:use-module (gnu packages version-control)
51 #:use-module (gnu packages video)
52 #:use-module (gnu packages webkit)
53 #:use-module (gnu packages xiph)
54 #:use-module (gnu packages xorg)
55 #:use-module (gnu packages)
56 #:use-module (guix build-system cmake)
57 #:use-module (guix build-system gnu)
58 #:use-module (guix download)
59 #:use-module (guix git-download)
60 #:use-module (guix packages)
61 #:use-module (guix utils))
62
63 (define %jami-version "20210326.1.cfba013")
64
65 (define* (jami-source #:key keep-contrib-patches?)
66 "Return an origin object of the tarball release sources archive of Jami.
67 When KEEP-CONTRIB-PATCHES? is #t, do not completely remove the contrib
68 subdirectory, which contains patches to be applied to some of the dependencies
69 of Jami."
70 (origin
71 (method url-fetch)
72 (uri (string-append "https://dl.jami.net/release/tarballs/jami_"
73 %jami-version
74 ".tar.gz"))
75 (modules '((guix build utils)))
76 (snippet
77 `(begin
78 ;; Delete multiple MiBs of bundled tarballs. The contrib directory
79 ;; contains the custom patches for pjproject and other libraries used
80 ;; by Savoir-faire Linux.
81 (if ,keep-contrib-patches?
82 (delete-file-recursively "daemon/contrib/tarballs")
83 (delete-file-recursively "daemon/contrib"))
84 ;; Remove code from unused Jami clients.
85 (for-each delete-file-recursively '("client-android"
86 "client-electron"
87 "client-ios"
88 "client-macosx"
89 "client-uwp"))))
90 (sha256
91 (base32
92 "1h0avma8bdzyznkz39crjyv2888bii4f49md15jg7970dyp5pdyz"))))
93
94 (define %sfl-patches (jami-source #:keep-contrib-patches? #t))
95
96 (define %jami-sources (jami-source))
97
98 ;; Savoir-faire Linux maintains a set of patches for some key dependencies
99 ;; (currently pjproject and ffmpeg) of Jami that haven't yet been integrated
100 ;; upstream. This procedure simplifies the process of applying these patches.x
101 (define jami-apply-dependency-patches
102 '(lambda* (#:key inputs dep-name patches)
103 (let ((patches-directory "sfl-patches"))
104 (mkdir-p patches-directory)
105 (invoke "tar" "-xvf" (assoc-ref inputs "sfl-patches")
106 "-C" patches-directory
107 "--strip-components=5"
108 (string-append "ring-project/daemon/contrib/src/"
109 dep-name))
110 (for-each
111 (lambda (file)
112 (invoke "patch" "--force" "--ignore-whitespace" "-p1" "-i"
113 (string-append patches-directory "/"
114 file ".patch")))
115 patches))))
116
117 ;;; Jami maintains pjproject patches that add the ability to do ICE over TCP,
118 ;;; among other things. The patches are currently based on pjproject 2.10.
119 (define-public pjproject-jami
120 (package
121 (inherit pjproject)
122 (name "pjproject-jami")
123 (version "2.10")
124 (source (origin
125 (method git-fetch)
126 (uri (git-reference
127 (url "https://github.com/pjsip/pjproject")
128 (commit version)))
129 (file-name (git-file-name name version))
130 (sha256
131 (base32
132 "1aklicpgwc88578k03i5d5cm5h8mfm7hmx8vfprchbmaa2p8f4z0"))
133 (patches (search-patches
134 "pjproject-correct-the-cflags-field.patch"
135 "pjproject-fix-pkg-config-ldflags.patch"))))
136 (native-inputs
137 `(("sfl-patches" ,%sfl-patches)
138 ,@(package-native-inputs pjproject)))
139 (arguments
140 (substitute-keyword-arguments (package-arguments pjproject)
141 ((#:phases phases '%standard-phases)
142 `(modify-phases ,phases
143 (add-after 'make-source-files-writable 'apply-patches
144 (lambda* (#:key inputs #:allow-other-keys)
145 (,jami-apply-dependency-patches
146 #:inputs inputs
147 #:dep-name "pjproject"
148 #:patches
149 '("0001-rfc6544"
150 "0002-rfc2466"
151 "0003-add-tcp-keep-alive"
152 "0004-multiple_listeners"
153 "0005-fix_ebusy_turn"
154 "0006-ignore_ipv6_on_transport_check"
155 "0007-upnp-srflx-nat-assisted-cand"
156 "0008-fix_ioqueue_ipv6_sendto"
157 "0009-add-config-site"
158 ;; Already taken care of via the origin patches.
159 ;;"0010-fix-pkgconfig"
160 "0011-fix-tcp-death-detection"
161 "0012-fix-turn-shutdown-crash"
162 "0013-Assign-unique-local-preferences-for-candidates-with-"
163 "0014-Add-new-compile-time-setting-PJ_ICE_ST_USE_TURN_PERM"
164 "0015-update-local-preference-for-peer-reflexive-candidate"
165 "0016-use-addrinfo-instead-CFHOST"
166 "0017-CVE-2020-15260"
167 "0018-CVE-2021-21375"))))))))))
168
169 ;; The following variables are configure flags used by ffmpeg-jami. They're
170 ;; from the ring-project/daemon/contrib/src/ffmpeg/rules.mak file. We try to
171 ;; keep it as close to the official Jami package as possible, to provide all
172 ;; the codecs and extra features that are expected.
173 ;;
174 ;; See:
175 ;; https://review.jami.net/plugins/gitiles/ring-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak
176
177 (define %ffmpeg-default-configure-flags
178 '("--disable-everything"
179 "--enable-zlib"
180 "--enable-gpl"
181 "--enable-swscale"
182 "--enable-bsfs"
183 "--disable-filters"
184 "--disable-programs"
185 "--disable-postproc"
186 "--disable-protocols"
187 "--enable-protocol=crypto"
188 "--enable-protocol=file"
189 "--enable-protocol=rtp"
190 "--enable-protocol=srtp"
191 "--enable-protocol=tcp"
192 "--enable-protocol=udp"
193 "--enable-protocol=unix"
194 "--enable-protocol=pipe"
195
196 ;; enable muxers/demuxers
197 "--disable-demuxers"
198 "--disable-muxers"
199 "--enable-muxer=rtp"
200 "--enable-muxer=g722"
201 "--enable-muxer=h263"
202 "--enable-muxer=h264"
203 "--enable-muxer=hevc"
204 "--enable-muxer=webm"
205 "--enable-muxer=ogg"
206 "--enable-muxer=pcm_s16be"
207 "--enable-muxer=pcm_s16le"
208 "--enable-demuxer=rtp"
209 "--enable-demuxer=mjpeg"
210 "--enable-demuxer=mjpeg_2000"
211 "--enable-demuxer=mpegvideo"
212 "--enable-demuxer=gif"
213 "--enable-demuxer=image_jpeg_pipe"
214 "--enable-demuxer=image_png_pipe"
215 "--enable-demuxer=image_webp_pipe"
216 "--enable-demuxer=matroska"
217 "--enable-demuxer=m4v"
218 "--enable-demuxer=mp3"
219 "--enable-demuxer=ogg"
220 "--enable-demuxer=flac"
221 "--enable-demuxer=wav"
222 "--enable-demuxer=ac3"
223 "--enable-demuxer=g722"
224 "--enable-demuxer=pcm_mulaw"
225 "--enable-demuxer=pcm_alaw"
226 "--enable-demuxer=pcm_s16be"
227 "--enable-demuxer=pcm_s16le"
228 "--enable-demuxer=h263"
229 "--enable-demuxer=h264"
230 "--enable-demuxer=hevc"
231
232 ;; enable parsers
233 "--enable-parser=h263"
234 "--enable-parser=h264"
235 "--enable-parser=hevc"
236 "--enable-parser=mpeg4video"
237 "--enable-parser=vp8"
238 "--enable-parser=vp9"
239 "--enable-parser=opus"
240
241 ;; encoders/decoders
242 "--enable-encoder=adpcm_g722"
243 "--enable-decoder=adpcm_g722"
244 "--enable-encoder=rawvideo"
245 "--enable-decoder=rawvideo"
246 "--enable-encoder=libx264"
247 "--enable-decoder=h264"
248 "--enable-encoder=pcm_alaw"
249 "--enable-decoder=pcm_alaw"
250 "--enable-encoder=pcm_mulaw"
251 "--enable-decoder=pcm_mulaw"
252 "--enable-encoder=mpeg4"
253 "--enable-decoder=mpeg4"
254 "--enable-encoder=libvpx_vp8"
255 "--enable-decoder=vp8"
256 "--enable-decoder=vp9"
257 "--enable-encoder=h263"
258 "--enable-encoder=h263p"
259 "--enable-decoder=h263"
260 "--enable-encoder=mjpeg"
261 "--enable-decoder=mjpeg"
262 "--enable-decoder=mjpegb"
263 "--enable-libspeex"
264 "--enable-libopus"
265 "--enable-libvpx"
266 "--enable-libx264"
267 "--enable-encoder=libspeex"
268 "--enable-decoder=libspeex"
269 "--enable-encoder=libopus"
270 "--enable-decoder=libopus"
271
272 ;; decoders for ringtones and audio streaming
273 "--enable-decoder=flac"
274 "--enable-decoder=vorbis"
275 "--enable-decoder=aac"
276 "--enable-decoder=ac3"
277 "--enable-decoder=eac3"
278 "--enable-decoder=mp3"
279 "--enable-decoder=pcm_u24be"
280 "--enable-decoder=pcm_u24le"
281 "--enable-decoder=pcm_u32be"
282 "--enable-decoder=pcm_u32le"
283 "--enable-decoder=pcm_u8"
284 "--enable-decoder=pcm_f16le"
285 "--enable-decoder=pcm_f24le"
286 "--enable-decoder=pcm_f32be"
287 "--enable-decoder=pcm_f32le"
288 "--enable-decoder=pcm_f64be"
289 "--enable-decoder=pcm_f64le"
290 "--enable-decoder=pcm_s16be"
291 "--enable-decoder=pcm_s16be_planar"
292 "--enable-decoder=pcm_s16le"
293 "--enable-decoder=pcm_s16le_planar"
294 "--enable-decoder=pcm_s24be"
295 "--enable-decoder=pcm_s24le"
296 "--enable-decoder=pcm_s24le_planar"
297 "--enable-decoder=pcm_s32be"
298 "--enable-decoder=pcm_s32le"
299 "--enable-decoder=pcm_s32le_planar"
300 "--enable-decoder=pcm_s64be"
301 "--enable-decoder=pcm_s64le"
302 "--enable-decoder=pcm_s8"
303 "--enable-decoder=pcm_s8_planar"
304 "--enable-decoder=pcm_u16be"
305 "--enable-decoder=pcm_u16le"
306
307 ;; encoders/decoders for images
308 "--enable-encoder=gif"
309 "--enable-decoder=gif"
310 "--enable-encoder=jpegls"
311 "--enable-decoder=jpegls"
312 "--enable-encoder=ljpeg"
313 "--enable-decoder=jpeg2000"
314 "--enable-encoder=png"
315 "--enable-decoder=png"
316 "--enable-encoder=bmp"
317 "--enable-decoder=bmp"
318 "--enable-encoder=tiff"
319 "--enable-decoder=tiff"
320
321 ;; filters
322 "--enable-filter=scale"
323 "--enable-filter=overlay"
324 "--enable-filter=amix"
325 "--enable-filter=amerge"
326 "--enable-filter=aresample"
327 "--enable-filter=format"
328 "--enable-filter=aformat"
329 "--enable-filter=fps"
330 "--enable-filter=transpose"
331 "--enable-filter=pad"))
332
333 (define %ffmpeg-linux-configure-flags
334 '("--enable-pic"
335 "--extra-cxxflags=-fPIC"
336 "--extra-cflags=-fPIC"
337 "--target-os=linux"
338 "--enable-indev=v4l2"
339 "--enable-indev=xcbgrab"
340 "--enable-vdpau"
341 "--enable-hwaccel=h264_vdpau"
342 "--enable-hwaccel=mpeg4_vdpau"
343 "--enable-vaapi"
344 "--enable-hwaccel=h264_vaapi"
345 "--enable-hwaccel=mpeg4_vaapi"
346 "--enable-hwaccel=h263_vaapi"
347 "--enable-hwaccel=vp8_vaapi"
348 "--enable-hwaccel=mjpeg_vaapi"
349 "--enable-hwaccel=hevc_vaapi"
350 "--enable-encoder=h264_vaapi"
351 "--enable-encoder=vp8_vaapi"
352 "--enable-encoder=mjpeg_vaapi"
353 "--enable-encoder=hevc_vaapi"))
354
355 ;; ffnvcodec is not supported on ARM then we enable it here for i386 and
356 ;; x86_64 architectures.
357 (define %ffmpeg-linux-x86-configure-flags
358 '("--arch=x86"
359 "--enable-cuvid"
360 "--enable-ffnvcodec"
361 "--enable-nvdec"
362 "--enable-nvenc"
363 "--enable-hwaccel=h264_nvdec"
364 "--enable-hwaccel=hevc_nvdec"
365 "--enable-hwaccel=vp8_nvdec"
366 "--enable-hwaccel=mjpeg_nvdec"
367 "--enable-encoder=h264_nvenc"
368 "--enable-encoder=hevc_nvenc"))
369
370 ;; This procedure composes the configure flags list for ffmpeg-jami.
371 (define (ffmpeg-compose-configure-flags)
372 (define (system=? s)
373 (string-prefix? s (%current-system)))
374
375 `(,@%ffmpeg-default-configure-flags
376 ,@(if (string-contains (%current-system) "linux")
377 (if (or (system=? "i686")
378 (system=? "x86_64"))
379 (append %ffmpeg-linux-configure-flags
380 %ffmpeg-linux-x86-configure-flags)
381 %ffmpeg-linux-configure-flags)
382 '())))
383
384 (define-public ffmpeg-jami
385 (package/inherit ffmpeg
386 (name "ffmpeg-jami")
387 (native-inputs
388 `(("sfl-patches" ,%sfl-patches)
389 ("libiconv" ,libiconv)
390 ,@(package-native-inputs ffmpeg)))
391 (supported-systems '("x86_64-linux" "i686-linux"
392 "aarch64-linux" "armhf-linux"))
393 (arguments
394 (append
395 '(#:tests? #f)
396 (substitute-keyword-arguments (package-arguments ffmpeg)
397 ((#:configure-flags '())
398 (ffmpeg-compose-configure-flags))
399 ((#:phases phases)
400 `(modify-phases ,phases
401 (add-after 'unpack 'make-git-checkout-writable
402 (lambda _
403 (for-each make-file-writable (find-files "."))))
404 (add-after 'unpack 'apply-patches
405 (lambda* (#:key inputs #:allow-other-keys)
406 (let ((jami-apply-dependency-patches
407 ,jami-apply-dependency-patches))
408 ;; These patches come from:
409 ;; "ring-project/daemon/contrib/src/ffmpeg/rules.mak".
410 (jami-apply-dependency-patches
411 #:inputs inputs
412 #:dep-name "ffmpeg"
413 #:patches
414 '("remove-mjpeg-log"
415 "change-RTCP-ratio"
416 "rtp_ext_abs_send_time"
417 "libopusdec-enable-FEC"
418 "libopusenc-enable-FEC"))))))))))))
419
420 (define-public libring
421 (package
422 (name "libring")
423 (version %jami-version)
424 (source %jami-sources)
425 (build-system gnu-build-system)
426 (inputs
427 `(("alsa-lib" ,alsa-lib)
428 ("asio" ,asio)
429 ("dbus-c++" ,dbus-c++)
430 ("eudev" ,eudev)
431 ("ffmpeg" ,ffmpeg-jami)
432 ("jack" ,jack-1)
433 ("jsoncpp" ,jsoncpp)
434 ("libarchive" ,libarchive)
435 ("libgit2" ,libgit2)
436 ("libnatpmp" ,libnatpmp)
437 ("libsecp256k1" ,libsecp256k1)
438 ("libupnp" ,libupnp)
439 ("opendht" ,opendht)
440 ("openssl" ,openssl)
441 ("pjproject" ,pjproject-jami)
442 ("pulseaudio" ,pulseaudio)
443 ("speex" ,speex)
444 ("speexdsp" ,speexdsp)
445 ("webrtc-audio-processing" ,webrtc-audio-processing)
446 ("yaml-cpp" ,yaml-cpp)))
447 (native-inputs
448 `(("autoconf" ,autoconf)
449 ("automake" ,automake)
450 ("gcc" ,gcc-8) ;charconv requires GCC 8.1+
451 ("libtool" ,libtool)
452 ("perl" ,perl) ;to generate manpages with pod2man
453 ("pkg-config" ,pkg-config)
454 ("which" ,which)))
455 (arguments
456 `(#:tests? #f ; The tests fail to compile due to missing headers.
457 #:make-flags '("V=1") ;build verbosely
458 #:phases
459 (modify-phases %standard-phases
460 (add-after 'unpack 'change-directory
461 (lambda _
462 (chdir "daemon")))
463 (add-before 'build 'add-lib-dir
464 (lambda _
465 (mkdir-p "src/lib"))))))
466 (synopsis "Jami core library and daemon")
467 (description "This package provides a library and daemon implementing the
468 Jami core functionality. Jami is a secure and distributed voice, video and
469 chat communication platform that requires no centralized server and leaves the
470 power of privacy in the hands of the user. It supports the SIP and IAX
471 protocols, as well as decentralized calling using P2P-DHT.")
472 (home-page "https://jami.net/")
473 (license license:gpl3+)))
474
475 (define-public libringclient
476 (package
477 (name "libringclient")
478 (version %jami-version)
479 (source %jami-sources)
480 (build-system cmake-build-system)
481 (inputs
482 `(("libring" ,libring)
483 ("network-manager" ,network-manager)))
484 (propagated-inputs
485 `(("qtbase" ,qtbase))) ; Qt is included in several installed headers.
486 (arguments
487 `(#:tests? #f ; There is no testsuite.
488 #:configure-flags
489 (let ((libring (assoc-ref %build-inputs "libring")))
490 (list (string-append "-DRING_XML_INTERFACES_DIR="
491 libring "/share/dbus-1/interfaces")
492 (string-append "-DRING_BUILD_DIR=" libring "/include")
493 ;; Use LIBWRAP, which removes the requirement on DBus. Qt
494 ;; links with the dbus library in Guix, which expects to find
495 ;; its configuration under /etc rather than /usr/share/dbus-1,
496 ;; which is perhaps the reason the auto-launching of dring
497 ;; doesn't work on foreign distributions.
498 "-DENABLE_LIBWRAP=true"))
499 #:phases
500 (modify-phases %standard-phases
501 (add-after 'unpack 'change-directory
502 (lambda _
503 (chdir "lrc"))))))
504 (synopsis "Jami client library")
505 (description "This package provides a library common to all Jami clients.
506 Jami is a secure and distributed voice, video and chat communication platform
507 that requires no centralized server and leaves the power of privacy in the
508 hands of the user. It supports the SIP and IAX protocols, as well as
509 decentralized calling using P2P-DHT.")
510 (home-page "https://jami.net")
511 (license license:gpl3+)))
512
513 (define-public jami-gnome
514 (package
515 (name "jami-gnome")
516 (version %jami-version)
517 (source %jami-sources)
518 (build-system cmake-build-system)
519 (inputs
520 `(("clutter" ,clutter)
521 ("clutter-gtk" ,clutter-gtk)
522 ("gtk+" ,gtk+)
523 ("libcanberra" ,libcanberra)
524 ("libappindicator" ,libappindicator)
525 ("libnotify" ,libnotify)
526 ("libringclient" ,libringclient)
527 ("network-manager" ,network-manager)
528 ("qrencode" ,qrencode)
529 ("sqlite" ,sqlite)
530 ("webkitgtk" ,webkitgtk)))
531 (native-inputs
532 `(("pkg-config" ,pkg-config)
533 ("gettext" ,gettext-minimal)
534 ("glib:bin" ,glib "bin"))) ;for glib-compile-resources
535 (propagated-inputs
536 `(("libring" ,libring) ; Contains 'dring', the daemon, which is
537 ; automatically started by DBus.
538 ("adwaita-icon-theme" ,adwaita-icon-theme)))
539 (arguments
540 `(#:tests? #f ; There is no testsuite.
541 #:phases
542 (modify-phases %standard-phases
543 (add-after 'unpack 'change-directory
544 (lambda _
545 (chdir "client-gnome"))))))
546 (synopsis "Jami client for GNOME")
547 (description "This package provides a Jami client for the GNOME desktop.
548 Jami is a secure and distributed voice, video and chat communication platform
549 that requires no centralized server and leaves the power of privacy in the
550 hands of the user. It supports the SIP and IAX protocols, as well as
551 decentralized calling using P2P-DHT.")
552 (home-page "https://jami.net")
553 (license license:gpl3+)))
554
555 ;;; Keep this until the Qt client matures enough to become the
556 ;;; main 'jami' client.
557 (define-public jami
558 (deprecated-package "jami" jami-gnome))