85a06026ed0c8cbd526ee2e7662bf8a588fadef0
[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 ;;;
6 ;;; This file is part of GNU Guix.
7 ;;;
8 ;;; GNU Guix is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; GNU Guix is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
20
21 (define-module (gnu packages jami)
22 #:use-module ((guix licenses) #:prefix license:)
23 #:use-module (gnu packages aidc)
24 #:use-module (gnu packages audio)
25 #:use-module (gnu packages autotools)
26 #:use-module (gnu packages backup)
27 #:use-module (gnu packages base)
28 #:use-module (gnu packages boost)
29 #:use-module (gnu packages check)
30 #:use-module (gnu packages compression)
31 #:use-module (gnu packages crypto)
32 #:use-module (gnu packages documentation)
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 hurd)
38 #:use-module (gnu packages libcanberra)
39 #:use-module (gnu packages linux)
40 #:use-module (gnu packages multiprecision)
41 #:use-module (gnu packages networking)
42 #:use-module (gnu packages pcre)
43 #:use-module (gnu packages perl)
44 #:use-module (gnu packages pkg-config)
45 #:use-module (gnu packages pulseaudio)
46 #:use-module (gnu packages python)
47 #:use-module (gnu packages qt)
48 #:use-module (gnu packages serialization)
49 #:use-module (gnu packages sqlite)
50 #:use-module (gnu packages telephony)
51 #:use-module (gnu packages tls)
52 #:use-module (gnu packages upnp)
53 #:use-module (gnu packages video)
54 #:use-module (gnu packages webkit)
55 #:use-module (gnu packages xiph)
56 #:use-module (gnu packages xorg)
57 #:use-module (gnu packages)
58 #:use-module (guix build-system cmake)
59 #:use-module (guix build-system gnu)
60 #:use-module (guix download)
61 #:use-module (guix git-download)
62 #:use-module (guix packages)
63 #:use-module (guix utils)
64 #:use-module (srfi srfi-1))
65
66 (define %jami-version "20200710.1.6bd18d2")
67
68 (define* (jami-source #:key without-daemon)
69 (origin
70 (method url-fetch)
71 (uri (string-append "https://dl.jami.net/release/tarballs/jami_"
72 %jami-version
73 ".tar.gz"))
74 (modules '((guix build utils)))
75 (snippet
76 (if without-daemon
77 '(begin
78 (delete-file-recursively "daemon/contrib"))
79 #f))
80 (sha256
81 (base32
82 "0lg61jv39x7kc9lq30by246xb6gcgp1rzj49ak7ff8nqpfzyfvva"))))
83
84 ;; Savoir-Faire Linux modifies many libraries to add features
85 ;; to Jami. This procedure makes applying patches to a given
86 ;; package easy.
87 (define jami-apply-dependency-patches
88 '(lambda* (#:key inputs dep-name patches)
89 (let ((patches-directory "sfl-patches"))
90 (mkdir-p patches-directory)
91 (invoke "tar" "-xvf" (assoc-ref inputs "sfl-patches")
92 "-C" patches-directory
93 "--strip-components=5"
94 (string-append "ring-project/daemon/contrib/src/"
95 dep-name))
96 (for-each
97 (lambda (file)
98 (invoke "patch" "--force" "-p1" "-i"
99 (string-append patches-directory "/"
100 file ".patch")))
101 patches))))
102
103 (define-public pjproject-jami
104 (package
105 (inherit pjproject)
106 (name "pjproject-jami")
107 (native-inputs
108 `(("sfl-patches" ,(jami-source))
109 ,@(package-native-inputs pjproject)))
110 (arguments
111 `(#:tests? #f
112 ;; See ring-project/daemon/contrib/src/pjproject/rules.mak.
113 #:configure-flags
114 (list "--disable-oss"
115 "--disable-sound"
116 "--disable-video"
117 ;; The following flag is Linux specific.
118 ,@(if (hurd-triplet? (or (%current-system)
119 (%current-target-system)))
120 '()
121 '("--enable-epoll"))
122 "--enable-ext-sound"
123 "--disable-speex-aec"
124 "--disable-g711-codec"
125 "--disable-l16-codec"
126 "--disable-gsm-codec"
127 "--disable-g722-codec"
128 "--disable-g7221-codec"
129 "--disable-speex-codec"
130 "--disable-ilbc-codec"
131 "--disable-opencore-amr"
132 "--disable-silk"
133 "--disable-sdl"
134 "--disable-ffmpeg"
135 "--disable-v4l2"
136 "--disable-openh264"
137 "--disable-resample"
138 "--disable-libwebrtc"
139 "--with-gnutls"
140 "--with-external-srtp"
141 ;; We need -fPIC or else we get the following error when linking
142 ;; against pjproject-jami:
143 ;; relocation R_X86_64_32S against `.rodata' can not be used when
144 ;; making a shared object;
145 ;; -DNDEBUG is needed to prevent assertion from happening and
146 ;; stopping the daemon.
147 "CFLAGS=-fPIC -DNDEBUG"
148 "CXXFLAGS=-fPIC -DNDEBUG")
149 #:phases
150 (modify-phases %standard-phases
151 (add-after 'unpack 'make-git-checkout-writable
152 (lambda _
153 (for-each make-file-writable (find-files "."))
154 #t))
155 (add-after 'unpack 'apply-patches
156 (lambda* (#:key inputs #:allow-other-keys)
157 (let ((jami-apply-dependency-patches ,jami-apply-dependency-patches))
158 ;; Comes from
159 ;; "ring-project/daemon/contrib/src/pjproject/rules.mak".
160 ;; WARNING: These amount for huge changes in pjproject.
161 (jami-apply-dependency-patches
162 #:inputs inputs
163 #:dep-name "pjproject"
164 #:patches
165 '("0001-rfc6544"
166 "0002-rfc2466"
167 "0003-add-tcp-keep-alive"
168 "0004-multiple_listeners"
169 "0005-fix_ebusy_turn"
170 "0006-ignore_ipv6_on_transport_check"
171 "0007-pj_ice_sess"
172 "0008-fix_ioqueue_ipv6_sendto"
173 "0009-add-config-site"
174 "0010-fix-pkgconfig"
175 "0011-fix-tcp-death-detection"
176 "0012-fix-turn-shutdown-crash"))
177 #t)))
178 ;; TODO: We could use substitute-keyword-arguments instead of
179 ;; repeating the phases from pjproject, but somehow it does
180 ;; not work.
181 (add-before 'build 'build-dep
182 (lambda _ (invoke "make" "dep")))
183 (add-before 'patch-source-shebangs 'autoconf
184 (lambda _
185 (invoke "autoconf" "-v" "-f" "-i" "-o"
186 "aconfigure" "aconfigure.ac")))
187 (add-before 'autoconf 'disable-some-tests
188 ;; Three of the six test programs fail due to missing network
189 ;; access.
190 (lambda _
191 (substitute* "Makefile"
192 (("selftest: pjlib-test pjlib-util-test pjnath-test pjmedia-test pjsip-test pjsua-test")
193 "selftest: pjlib-test pjlib-util-test pjmedia-test"))
194 #t)))))))
195
196 ;; The following variables are configure flags used by ffmpeg-jami. They're
197 ;; from the ring-project/daemon/contrib/src/ffmpeg/rules.mak file. We try to
198 ;; keep it as close to the official Jami package as possible, to provide all
199 ;; the codecs and extra features that are expected.
200 ;;
201 ;; See:
202 ;; https://review.jami.net/plugins/gitiles/ring-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak
203
204 (define %ffmpeg-default-configure-flags
205 '("--disable-everything"
206 "--enable-zlib"
207 "--enable-gpl"
208 "--enable-swscale"
209 "--enable-bsfs"
210 "--disable-filters"
211 "--disable-programs"
212 "--disable-postproc"
213 "--disable-protocols"
214 "--enable-protocol=crypto"
215 "--enable-protocol=file"
216 "--enable-protocol=rtp"
217 "--enable-protocol=srtp"
218 "--enable-protocol=tcp"
219 "--enable-protocol=udp"
220 "--enable-protocol=unix"
221 "--enable-protocol=pipe"
222
223 ;; enable muxers/demuxers
224 "--disable-demuxers"
225 "--disable-muxers"
226 "--enable-muxer=rtp"
227 "--enable-muxer=g722"
228 "--enable-muxer=h263"
229 "--enable-muxer=h264"
230 "--enable-muxer=hevc"
231 "--enable-muxer=webm"
232 "--enable-muxer=ogg"
233 "--enable-muxer=pcm_s16be"
234 "--enable-muxer=pcm_s16le"
235 "--enable-demuxer=rtp"
236 "--enable-demuxer=mjpeg"
237 "--enable-demuxer=mjpeg_2000"
238 "--enable-demuxer=mpegvideo"
239 "--enable-demuxer=gif"
240 "--enable-demuxer=image_jpeg_pipe"
241 "--enable-demuxer=image_png_pipe"
242 "--enable-demuxer=image_webp_pipe"
243 "--enable-demuxer=matroska"
244 "--enable-demuxer=m4v"
245 "--enable-demuxer=mp3"
246 "--enable-demuxer=ogg"
247 "--enable-demuxer=flac"
248 "--enable-demuxer=wav"
249 "--enable-demuxer=ac3"
250 "--enable-demuxer=g722"
251 "--enable-demuxer=pcm_mulaw"
252 "--enable-demuxer=pcm_alaw"
253 "--enable-demuxer=pcm_s16be"
254 "--enable-demuxer=pcm_s16le"
255 "--enable-demuxer=h263"
256 "--enable-demuxer=h264"
257 "--enable-demuxer=hevc"
258
259 ;; enable parsers
260 "--enable-parser=h263"
261 "--enable-parser=h264"
262 "--enable-parser=hevc"
263 "--enable-parser=mpeg4video"
264 "--enable-parser=vp8"
265 "--enable-parser=vp9"
266 "--enable-parser=opus"
267
268 ;; encoders/decoders
269 "--enable-encoder=adpcm_g722"
270 "--enable-decoder=adpcm_g722"
271 "--enable-encoder=rawvideo"
272 "--enable-decoder=rawvideo"
273 "--enable-encoder=libx264"
274 "--enable-decoder=h264"
275 "--enable-encoder=pcm_alaw"
276 "--enable-decoder=pcm_alaw"
277 "--enable-encoder=pcm_mulaw"
278 "--enable-decoder=pcm_mulaw"
279 "--enable-encoder=mpeg4"
280 "--enable-decoder=mpeg4"
281 "--enable-encoder=libvpx_vp8"
282 "--enable-decoder=vp8"
283 "--enable-decoder=vp9"
284 "--enable-encoder=h263"
285 "--enable-encoder=h263p"
286 "--enable-decoder=h263"
287 "--enable-encoder=mjpeg"
288 "--enable-decoder=mjpeg"
289 "--enable-decoder=mjpegb"
290 "--enable-libspeex"
291 "--enable-libopus"
292 "--enable-libvpx"
293 "--enable-libx264"
294 "--enable-encoder=libspeex"
295 "--enable-decoder=libspeex"
296 "--enable-encoder=libopus"
297 "--enable-decoder=libopus"
298
299 ;; decoders for ringtones and audio streaming
300 "--enable-decoder=flac"
301 "--enable-decoder=vorbis"
302 "--enable-decoder=aac"
303 "--enable-decoder=ac3"
304 "--enable-decoder=eac3"
305 "--enable-decoder=mp3"
306 "--enable-decoder=pcm_u24be"
307 "--enable-decoder=pcm_u24le"
308 "--enable-decoder=pcm_u32be"
309 "--enable-decoder=pcm_u32le"
310 "--enable-decoder=pcm_u8"
311 "--enable-decoder=pcm_f16le"
312 "--enable-decoder=pcm_f24le"
313 "--enable-decoder=pcm_f32be"
314 "--enable-decoder=pcm_f32le"
315 "--enable-decoder=pcm_f64be"
316 "--enable-decoder=pcm_f64le"
317 "--enable-decoder=pcm_s16be"
318 "--enable-decoder=pcm_s16be_planar"
319 "--enable-decoder=pcm_s16le"
320 "--enable-decoder=pcm_s16le_planar"
321 "--enable-decoder=pcm_s24be"
322 "--enable-decoder=pcm_s24le"
323 "--enable-decoder=pcm_s24le_planar"
324 "--enable-decoder=pcm_s32be"
325 "--enable-decoder=pcm_s32le"
326 "--enable-decoder=pcm_s32le_planar"
327 "--enable-decoder=pcm_s64be"
328 "--enable-decoder=pcm_s64le"
329 "--enable-decoder=pcm_s8"
330 "--enable-decoder=pcm_s8_planar"
331 "--enable-decoder=pcm_u16be"
332 "--enable-decoder=pcm_u16le"
333
334 ;; encoders/decoders for images
335 "--enable-encoder=gif"
336 "--enable-decoder=gif"
337 "--enable-encoder=jpegls"
338 "--enable-decoder=jpegls"
339 "--enable-encoder=ljpeg"
340 "--enable-decoder=jpeg2000"
341 "--enable-encoder=png"
342 "--enable-decoder=png"
343 "--enable-encoder=bmp"
344 "--enable-decoder=bmp"
345 "--enable-encoder=tiff"
346 "--enable-decoder=tiff"
347
348 ;; filters
349 "--enable-filter=scale"
350 "--enable-filter=overlay"
351 "--enable-filter=amix"
352 "--enable-filter=amerge"
353 "--enable-filter=aresample"
354 "--enable-filter=format"
355 "--enable-filter=aformat"
356 "--enable-filter=fps"
357 "--enable-filter=transpose"
358 "--enable-filter=pad"))
359
360 (define %ffmpeg-linux-configure-flags
361 '("--enable-pic"
362 "--extra-cxxflags=-fPIC"
363 "--extra-cflags=-fPIC"
364 "--target-os=linux"
365 "--enable-indev=v4l2"
366 "--enable-indev=xcbgrab"
367 "--enable-vdpau"
368 "--enable-hwaccel=h264_vdpau"
369 "--enable-hwaccel=mpeg4_vdpau"
370 "--enable-vaapi"
371 "--enable-hwaccel=h264_vaapi"
372 "--enable-hwaccel=mpeg4_vaapi"
373 "--enable-hwaccel=h263_vaapi"
374 "--enable-hwaccel=vp8_vaapi"
375 "--enable-hwaccel=mjpeg_vaapi"
376 "--enable-hwaccel=hevc_vaapi"
377 "--enable-encoder=h264_vaapi"
378 "--enable-encoder=vp8_vaapi"
379 "--enable-encoder=mjpeg_vaapi"
380 "--enable-encoder=hevc_vaapi"))
381
382 ;; ffnvcodec is not supported on ARM then we enable it here for i386 and
383 ;; x86_64 architectures.
384 (define %ffmpeg-linux-x86-configure-flags
385 '("--arch=x86"
386 "--enable-cuvid"
387 "--enable-ffnvcodec"
388 "--enable-nvdec"
389 "--enable-nvenc"
390 "--enable-hwaccel=h264_nvdec"
391 "--enable-hwaccel=hevc_nvdec"
392 "--enable-hwaccel=vp8_nvdec"
393 "--enable-hwaccel=mjpeg_nvdec"
394 "--enable-encoder=h264_nvenc"
395 "--enable-encoder=hevc_nvenc"))
396
397 ;; This procedure composes the configure flags list for ffmpeg-jami.
398 (define (ffmpeg-compose-configure-flags)
399 (define (system=? s)
400 (string-prefix? s (%current-system)))
401
402 `(,@%ffmpeg-default-configure-flags
403 ,@(if (string-contains (%current-system) "linux")
404 (if (or (system=? "i686")
405 (system=? "x86_64"))
406 (append %ffmpeg-linux-configure-flags
407 %ffmpeg-linux-x86-configure-flags)
408 %ffmpeg-linux-configure-flags)
409 '())))
410
411 (define-public ffmpeg-jami
412 (package
413 (inherit ffmpeg)
414 (name "ffmpeg-jami")
415 (native-inputs
416 `(("sfl-patches" ,(jami-source))
417 ("libiconv" ,libiconv)
418 ,@(package-native-inputs ffmpeg)))
419 (supported-systems '("x86_64-linux" "i686-linux"
420 "aarch64-linux" "armhf-linux"))
421 (arguments
422 (append
423 '(#:tests? #f)
424 (substitute-keyword-arguments (package-arguments ffmpeg)
425 ((#:configure-flags '())
426 (ffmpeg-compose-configure-flags))
427 ((#:phases phases)
428 `(modify-phases ,phases
429 (add-after 'unpack 'make-git-checkout-writable
430 (lambda _
431 (for-each make-file-writable (find-files "."))
432 #t))
433 (add-after 'unpack 'apply-patches
434 (lambda* (#:key inputs #:allow-other-keys)
435 (let ((jami-apply-dependency-patches
436 ,jami-apply-dependency-patches))
437 ;; These patches come from:
438 ;; "ring-project/daemon/contrib/src/ffmpeg/rules.mak".
439 (jami-apply-dependency-patches #:inputs inputs
440 #:dep-name "ffmpeg"
441 #:patches
442 '("remove-mjpeg-log"
443 "change-RTCP-ratio"
444 "rtp_ext_abs_send_time"))
445 #t))))))))))
446
447 (define-public libring
448 (package
449 (name "libring")
450 (version %jami-version)
451 (source (jami-source #:without-daemon #t))
452 (build-system gnu-build-system)
453 (inputs
454 `(("alsa-lib" ,alsa-lib)
455 ("boost" ,boost)
456 ("dbus-c++" ,dbus-c++)
457 ("eudev" ,eudev)
458 ("ffmpeg" ,ffmpeg-jami)
459 ("flac" ,flac)
460 ("gmp" ,gmp)
461 ("gsm" ,gsm)
462 ("jack" ,jack-1)
463 ("jsoncpp" ,jsoncpp)
464 ("libarchive" ,libarchive)
465 ("libnatpmp" ,libnatpmp)
466 ("libogg" ,libogg)
467 ("libva" ,libva)
468 ("opendht" ,opendht)
469 ("opus" ,opus)
470 ("pcre" ,pcre)
471 ("pulseaudio" ,pulseaudio)
472 ("libsamplerate" ,libsamplerate)
473 ("libsndfile" ,libsndfile)
474 ("speex" ,speex)
475 ("speexdsp" ,speexdsp)
476 ("libupnp" ,libupnp)
477 ("libvorbis" ,libvorbis)
478 ("libx264" ,libx264)
479 ("libvdpau" ,libvdpau)
480 ("yaml-cpp" ,yaml-cpp)
481 ("zlib" ,zlib)
482 ("openssl" ,openssl)
483 ("libsecp256k1" ,libsecp256k1)
484 ("python" ,python)
485 ("python-wrapper" ,python-wrapper)
486 ("restinio" ,restinio)
487 ("libx11" ,libx11)
488 ("asio" ,asio)
489 ;; TODO: Upstream seems to rely on a custom pjproject (a.k.a. pjsip) version.
490 ;; See https://git.jami.net/savoirfairelinux/ring-daemon/issues/24.
491 ("pjproject" ,pjproject-jami)))
492 (native-inputs
493 `(("autoconf" ,autoconf)
494 ("automake" ,automake)
495 ("libtool" ,libtool)
496 ("pkg-config" ,pkg-config)
497 ("which" ,which)
498 ("cppunit" ,cppunit)
499 ("perl" ,perl))) ; Needed for documentation.
500 (arguments
501 `(#:tests? #f ; The tests fail to compile due to missing headers.
502 #:phases
503 (modify-phases %standard-phases
504 (add-after 'unpack 'change-directory
505 (lambda _
506 (chdir "daemon")
507 #t))
508 (add-before 'build 'add-lib-dir
509 (lambda _
510 (mkdir-p "src/lib")
511 #t)))))
512 (synopsis "Distributed multimedia communications platform")
513 (description "Jami (formerly GNU Ring) is a secure and distributed voice,
514 video and chat communication platform that requires no centralized server and
515 leaves the power of privacy in the hands of the user. It supports the SIP and
516 IAX protocols, as well as decentralized calling using P2P-DHT.
517
518 This package provides a library and daemon implementing the Jami core
519 functionality.")
520 (home-page "https://jami.net/")
521 (license license:gpl3+)))
522
523 (define-public libringclient
524 (package
525 (inherit libring)
526 (name "libringclient")
527 (build-system cmake-build-system)
528 (propagated-inputs
529 `(("libring" ,libring) ; For 'dring'.
530 ("qtbase" ,qtbase) ; Qt is included in several installed headers.
531 ("qttools" ,qttools)))
532 (arguments
533 `(#:tests? #f ; There is no testsuite.
534 #:configure-flags
535 (list (string-append "-DRING_BUILD_DIR="
536 (assoc-ref %build-inputs "libring") "/include"))
537 #:phases
538 (modify-phases %standard-phases
539 (add-after 'unpack 'change-directory
540 (lambda _
541 (chdir "lrc")
542 #t))
543 (add-before 'configure 'fix-dbus-interfaces-path
544 (lambda* (#:key inputs #:allow-other-keys)
545 (substitute* "CMakeLists.txt"
546 (("\\$\\{CMAKE_INSTALL_PREFIX\\}(/share/dbus-1/interfaces)" _ dbus-interfaces-path-suffix)
547 (string-append (assoc-ref inputs "libring")
548 dbus-interfaces-path-suffix))))))))
549 (synopsis "Distributed multimedia communications platform")
550 (description "Jami (formerly GNU Ring) is a secure and distributed voice,
551 video and chat communication platform that requires no centralized server and
552 leaves the power of privacy in the hands of the user. It supports the SIP and
553 IAX protocols, as well as decentralized calling using P2P-DHT.
554
555 This package provides a library common to all Jami clients.")
556 (home-page "https://jami.net")
557 (license license:gpl3+)))
558
559 (define-public jami
560 (package
561 (inherit libring)
562 (name "jami")
563 (build-system cmake-build-system)
564 (inputs
565 `(("libringclient" ,libringclient)
566 ("gtk+" ,gtk+)
567 ("qrencode" ,qrencode)
568 ("libnotify" ,libnotify)
569 ("clutter" ,clutter)
570 ("clutter-gtk" ,clutter-gtk)
571 ("libcanberra" ,libcanberra)
572 ("webkitgtk" ,webkitgtk)
573 ("sqlite" ,sqlite)))
574 (native-inputs
575 `(("pkg-config" ,pkg-config)
576 ("gettext" ,gettext-minimal)
577 ("glib:bin" ,glib "bin")
578 ("doxygen" ,doxygen)))
579 (propagated-inputs
580 `(("libring" ,libring) ; Contains `dring', the daemon, which is automatically by d-bus.
581 ("adwaita-icon-theme" ,adwaita-icon-theme)
582 ("evolution-data-server" ,evolution-data-server)))
583 (arguments
584 `(#:tests? #f ; There is no testsuite.
585 #:phases
586 (modify-phases %standard-phases
587 (add-after 'unpack 'change-directory
588 (lambda _
589 (chdir "client-gnome")
590 #t)))))
591 (synopsis "Distributed, privacy-respecting communication program")
592 (description "Jami (formerly GNU Ring) is a secure and distributed voice,
593 video and chat communication platform that requires no centralized server and
594 leaves the power of privacy in the hands of the user. It supports the SIP and
595 IAX protocols, as well as decentralized calling using P2P-DHT.
596
597 This package provides the Jami client for the GNOME desktop.")
598 (home-page "https://jami.net")
599 (license license:gpl3+)))