gnu: emacs-scratch-el: Update source and homepage.
[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, 2022 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 check)
30 #:use-module (gnu packages crypto)
31 #:use-module (gnu packages documentation)
32 #:use-module (gnu packages freedesktop)
33 #:use-module (gnu packages gettext)
34 #:use-module (gnu packages glib)
35 #:use-module (gnu packages gnome)
36 #:use-module (gnu packages graphviz)
37 #:use-module (gnu packages gtk)
38 #:use-module (gnu packages guile)
39 #:use-module (gnu packages libcanberra)
40 #:use-module (gnu packages linux)
41 #:use-module (gnu packages networking)
42 #:use-module (gnu packages perl)
43 #:use-module (gnu packages pkg-config)
44 #:use-module (gnu packages pulseaudio)
45 #:use-module (gnu packages python)
46 #:use-module (gnu packages qt)
47 #:use-module (gnu packages serialization)
48 #:use-module (gnu packages sqlite)
49 #:use-module (gnu packages telephony)
50 #:use-module (gnu packages tls)
51 #:use-module (gnu packages upnp)
52 #:use-module (gnu packages version-control)
53 #:use-module (gnu packages video)
54 #:use-module (gnu packages vulkan)
55 #:use-module (gnu packages webkit)
56 #:use-module (gnu packages xdisorg)
57 #:use-module (gnu packages xiph)
58 #:use-module (gnu packages xorg)
59 #:use-module (gnu packages)
60 #:use-module (guix build-system cmake)
61 #:use-module (guix build-system gnu)
62 #:use-module (guix build-system qt)
63 #:use-module (guix download)
64 #:use-module (guix gexp)
65 #:use-module (guix git-download)
66 #:use-module (guix packages)
67 #:use-module (guix utils))
68
69 (define %jami-version "20220825.0828.c10f01f")
70
71 (define %jami-sources
72 ;; Return an origin object of the tarball release sources archive of the
73 ;; Jami project.
74 (origin
75 (method url-fetch)
76 (uri (string-append "https://dl.jami.net/release/tarballs/jami_"
77 %jami-version
78 ".tar.gz"))
79 (modules '((guix build utils)))
80 (snippet
81 `(begin
82 ;; Delete multiple MiBs of bundled tarballs. The contrib directory
83 ;; contains the custom patches for pjproject and other libraries used
84 ;; by Jami.
85 (delete-file-recursively "daemon/contrib/tarballs")
86 ;; Remove the git submodule directories of unused Jami clients.
87 (for-each delete-file-recursively '("client-android"
88 "client-ios"
89 "client-macosx"
90 "plugins"))))
91 (sha256
92 (base32
93 "1iv06jb66g206qxm75v7rc3mqvrml1028avflsj11chj8jh63j14"))
94 (patches (search-patches "jami-fix-crash-on-block-contact.patch"))))
95
96 ;; Jami maintains a set of patches for some key dependencies (currently
97 ;; pjproject and ffmpeg) of Jami that haven't yet been integrated upstream.
98 ;; This procedure simplifies the process of applying them.
99 (define jami-apply-custom-patches
100 #~(lambda* (#:key dep-name patches)
101 (let ((patches-directory "patches"))
102 (mkdir-p patches-directory)
103 (invoke "tar" "-xvf" #$%jami-sources
104 "-C" patches-directory
105 "--strip-components=5"
106 (string-append "jami-project/daemon/contrib/src/"
107 dep-name))
108 (for-each
109 (lambda (file)
110 (invoke "patch" "--force" "--ignore-whitespace" "-p1" "-i"
111 (string-append patches-directory "/"
112 file ".patch")))
113 patches))))
114
115 (define-public pjproject-jami
116 (let ((commit "5e478bbf8692f43059de9c6ad654b377359baaa0")
117 (revision "0"))
118 (package
119 (inherit pjproject)
120 (name "pjproject-jami")
121 (version (git-version "2.12" revision commit))
122 (source (origin
123 (inherit (package-source pjproject))
124 ;; The Jami development team regularly issues patches to
125 ;; pjproject to extend the its functionality and fix bugs;
126 ;; they are submitted for inclusion upstream but larger
127 ;; patches take time to be reviewed and merged, hence this
128 ;; forked repository.
129 (method git-fetch)
130 (uri (git-reference
131 (url "https://github.com/savoirfairelinux/pjproject")
132 (commit commit)))
133 (file-name (git-file-name name version))
134 (sha256
135 (base32
136 "0n9hyqr57hhbmq35iqq5ihavj22gxzsspv0f8i6ajxwd4029nmcl"))))
137 (arguments
138 (substitute-keyword-arguments (package-arguments pjproject)
139 ((#:phases phases '%standard-phases)
140 #~(modify-phases #$phases
141 (add-after 'unpack 'apply-patches
142 (lambda _
143 (#$jami-apply-custom-patches
144 #:dep-name "pjproject"
145 #:patches
146 ;; This adds a config_site.h configuration file that sets
147 ;; constants such as PJ_ICE_MAX_CAND that cannot be
148 ;; configured at build time.
149 '("0009-add-config-site")))))))))))
150
151 ;; The following variables are configure flags used by ffmpeg-jami. They're
152 ;; from the jami-project/daemon/contrib/src/ffmpeg/rules.mak file. We try to
153 ;; keep it as close to the official Jami package as possible, to provide all
154 ;; the codecs and extra features that are expected (see:
155 ;; https://review.jami.net/plugins/gitiles/ring-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak)
156 (define %ffmpeg-default-configure-flags
157 '("--disable-everything"
158 "--enable-zlib"
159 "--enable-gpl"
160 "--enable-swscale"
161 "--enable-bsfs"
162 "--disable-filters"
163 "--disable-programs"
164 "--disable-postproc"
165 "--disable-protocols"
166 "--enable-protocol=crypto"
167 "--enable-protocol=file"
168 "--enable-protocol=rtp"
169 "--enable-protocol=srtp"
170 "--enable-protocol=tcp"
171 "--enable-protocol=udp"
172 "--enable-protocol=unix"
173 "--enable-protocol=pipe"
174
175 ;; Enable muxers/demuxers.
176 "--disable-demuxers"
177 "--disable-muxers"
178 "--enable-muxer=rtp"
179 "--enable-muxer=g722"
180 "--enable-muxer=g726"
181 "--enable-muxer=g726le"
182 "--enable-muxer=h263"
183 "--enable-muxer=h264"
184 "--enable-muxer=hevc"
185 "--enable-muxer=matroska"
186 "--enable-muxer=webm"
187 "--enable-muxer=ogg"
188 "--enable-muxer=pcm_s16be"
189 "--enable-muxer=pcm_s16le"
190 "--enable-demuxer=rtp"
191 "--enable-demuxer=mjpeg"
192 "--enable-demuxer=mjpeg_2000"
193 "--enable-demuxer=mpegvideo"
194 "--enable-demuxer=gif"
195 "--enable-demuxer=image_jpeg_pipe"
196 "--enable-demuxer=image_png_pipe"
197 "--enable-demuxer=image_webp_pipe"
198 "--enable-demuxer=matroska"
199 "--enable-demuxer=m4v"
200 "--enable-demuxer=mp3"
201 "--enable-demuxer=ogg"
202 "--enable-demuxer=flac"
203 "--enable-demuxer=wav"
204 "--enable-demuxer=ac3"
205 "--enable-demuxer=g722"
206 "--enable-demuxer=g723_1"
207 "--enable-demuxer=g726"
208 "--enable-demuxer=g726le"
209 "--enable-demuxer=pcm_mulaw"
210 "--enable-demuxer=pcm_alaw"
211 "--enable-demuxer=pcm_s16be"
212 "--enable-demuxer=pcm_s16le"
213 "--enable-demuxer=h263"
214 "--enable-demuxer=h264"
215 "--enable-demuxer=hevc"
216
217 ;; Enable parsers.
218 "--enable-parser=h263"
219 "--enable-parser=h264"
220 "--enable-parser=hevc"
221 "--enable-parser=mpeg4video"
222 "--enable-parser=vp8"
223 "--enable-parser=vp9"
224 "--enable-parser=opus"
225
226 ;; Encoders/decoders.
227 "--enable-encoder=adpcm_g722"
228 "--enable-decoder=adpcm_g722"
229 "--enable-encoder=adpcm_g726"
230 "--enable-decoder=adpcm_g726"
231 "--enable-encoder=adpcm_g726le"
232 "--enable-decoder=adpcm_g726le"
233 "--enable-decoder=g729"
234 "--enable-encoder=g723_1"
235 "--enable-decoder=g723_1"
236 "--enable-encoder=rawvideo"
237 "--enable-decoder=rawvideo"
238 "--enable-encoder=libx264"
239 "--enable-decoder=h264"
240 "--enable-encoder=pcm_alaw"
241 "--enable-decoder=pcm_alaw"
242 "--enable-encoder=pcm_mulaw"
243 "--enable-decoder=pcm_mulaw"
244 "--enable-encoder=mpeg4"
245 "--enable-decoder=mpeg4"
246 "--enable-encoder=libvpx_vp8"
247 "--enable-decoder=vp8"
248 "--enable-decoder=vp9"
249 "--enable-encoder=h263"
250 "--enable-encoder=h263p"
251 "--enable-decoder=h263"
252 "--enable-encoder=mjpeg"
253 "--enable-decoder=mjpeg"
254 "--enable-decoder=mjpegb"
255 "--enable-libspeex"
256 "--enable-libopus"
257 "--enable-libvpx"
258 "--enable-libx264"
259 "--enable-encoder=libspeex"
260 "--enable-decoder=libspeex"
261 "--enable-encoder=libopus"
262 "--enable-decoder=libopus"
263
264 ;; Decoders for ringtones and audio streaming.
265 "--enable-decoder=flac"
266 "--enable-decoder=vorbis"
267 "--enable-decoder=aac"
268 "--enable-decoder=ac3"
269 "--enable-decoder=eac3"
270 "--enable-decoder=mp3"
271 "--enable-decoder=pcm_u24be"
272 "--enable-decoder=pcm_u24le"
273 "--enable-decoder=pcm_u32be"
274 "--enable-decoder=pcm_u32le"
275 "--enable-decoder=pcm_u8"
276 "--enable-decoder=pcm_f16le"
277 "--enable-decoder=pcm_f24le"
278 "--enable-decoder=pcm_f32be"
279 "--enable-decoder=pcm_f32le"
280 "--enable-decoder=pcm_f64be"
281 "--enable-decoder=pcm_f64le"
282 "--enable-decoder=pcm_s16be"
283 "--enable-decoder=pcm_s16be_planar"
284 "--enable-decoder=pcm_s16le"
285 "--enable-decoder=pcm_s16le_planar"
286 "--enable-decoder=pcm_s24be"
287 "--enable-decoder=pcm_s24le"
288 "--enable-decoder=pcm_s24le_planar"
289 "--enable-decoder=pcm_s32be"
290 "--enable-decoder=pcm_s32le"
291 "--enable-decoder=pcm_s32le_planar"
292 "--enable-decoder=pcm_s64be"
293 "--enable-decoder=pcm_s64le"
294 "--enable-decoder=pcm_s8"
295 "--enable-decoder=pcm_s8_planar"
296 "--enable-decoder=pcm_u16be"
297 "--enable-decoder=pcm_u16le"
298
299 ;; Encoders/decoders for images.
300 "--enable-encoder=gif"
301 "--enable-decoder=gif"
302 "--enable-encoder=jpegls"
303 "--enable-decoder=jpegls"
304 "--enable-encoder=ljpeg"
305 "--enable-decoder=jpeg2000"
306 "--enable-encoder=png"
307 "--enable-decoder=png"
308 "--enable-encoder=bmp"
309 "--enable-decoder=bmp"
310 "--enable-encoder=tiff"
311 "--enable-decoder=tiff"
312
313 ;; Filters.
314 "--enable-filter=scale"
315 "--enable-filter=overlay"
316 "--enable-filter=amix"
317 "--enable-filter=amerge"
318 "--enable-filter=aresample"
319 "--enable-filter=format"
320 "--enable-filter=aformat"
321 "--enable-filter=fps"
322 "--enable-filter=transpose"
323 "--enable-filter=pad"))
324
325 (define %ffmpeg-linux-configure-flags
326 '("--enable-pic"
327 "--extra-cxxflags=-fPIC"
328 "--extra-cflags=-fPIC"
329 "--target-os=linux"
330 "--enable-indev=v4l2"
331 "--enable-indev=xcbgrab"
332 "--enable-vdpau"
333 "--enable-hwaccel=h264_vdpau"
334 "--enable-hwaccel=mpeg4_vdpau"
335 "--enable-vaapi"
336 "--enable-hwaccel=h264_vaapi"
337 "--enable-hwaccel=mpeg4_vaapi"
338 "--enable-hwaccel=h263_vaapi"
339 "--enable-hwaccel=vp8_vaapi"
340 "--enable-hwaccel=mjpeg_vaapi"
341 "--enable-hwaccel=hevc_vaapi"
342 "--enable-encoder=h264_vaapi"
343 "--enable-encoder=vp8_vaapi"
344 "--enable-encoder=mjpeg_vaapi"
345 "--enable-encoder=hevc_vaapi"))
346
347 ;; ffnvcodec is not supported on ARM; enable it only for the i386 and x86_64
348 ;; architectures.
349 (define %ffmpeg-linux-x86-configure-flags
350 '("--arch=x86"
351 "--enable-cuvid"
352 "--enable-ffnvcodec"
353 "--enable-nvdec"
354 "--enable-nvenc"
355 "--enable-hwaccel=h264_nvdec"
356 "--enable-hwaccel=hevc_nvdec"
357 "--enable-hwaccel=vp8_nvdec"
358 "--enable-hwaccel=mjpeg_nvdec"
359 "--enable-encoder=h264_nvenc"
360 "--enable-encoder=hevc_nvenc"))
361
362 ;; This procedure composes the configure flags list for ffmpeg-jami.
363 (define (ffmpeg-compose-configure-flags)
364 (define (system=? s)
365 (string-prefix? s (%current-system)))
366
367 `(,@%ffmpeg-default-configure-flags
368 ,@(if (string-contains (%current-system) "linux")
369 (if (or (system=? "i686")
370 (system=? "x86_64"))
371 (append %ffmpeg-linux-configure-flags
372 %ffmpeg-linux-x86-configure-flags)
373 %ffmpeg-linux-configure-flags)
374 '())))
375
376 (define-public ffmpeg-jami
377 (package
378 (inherit ffmpeg-5)
379 (name "ffmpeg-jami")
380 ;; XXX: Use a slightly older version, otherwise the
381 ;; 'libopusdec-enable-FEC' patch doesn't apply.
382 (version "5.0.1")
383 (source (origin
384 (method url-fetch)
385 (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
386 version ".tar.xz"))
387 (sha256
388 (base32
389 "0yq0jcdc4qm5znrzylj3dsicrkk2n3n8bv28vr0a506fb7iglbpg"))))
390 (arguments
391 (substitute-keyword-arguments (package-arguments ffmpeg-5)
392 ((#:configure-flags '())
393 (ffmpeg-compose-configure-flags))
394 ((#:phases phases)
395 #~(modify-phases #$phases
396 (add-after 'unpack 'apply-patches
397 (lambda _
398 ;; These patches come from:
399 ;; "jami-project/daemon/contrib/src/ffmpeg/rules.mak".
400 (#$jami-apply-custom-patches
401 #:dep-name "ffmpeg"
402 #:patches '("remove-mjpeg-log"
403 "change-RTCP-ratio"
404 "rtp_ext_abs_send_time"
405 "libopusdec-enable-FEC"
406 "libopusenc-reload-packet-loss-at-encode"
407 "screen-sharing-x11-fix"))))
408 (add-after 'apply-patches 'disable-problematic-tests
409 (lambda _
410 ;; The "rtp_ext_abs_send_time" patch causes the 'lavf-mov_rtphint'
411 ;; test to fail (see:
412 ;; https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/685).
413 (substitute* "tests/fate/lavf-container.mak"
414 (("mov mov_rtphint ismv")
415 "mov ismv")
416 (("fate-lavf-mov_rtphint:.*") ""))))))))))
417
418 (define-public libjami
419 (package
420 (name "libjami")
421 (version %jami-version)
422 (source %jami-sources)
423 (outputs '("out" "debug"))
424 (build-system gnu-build-system)
425 (arguments
426 (list
427 ;; The test suite fails to link when building libjami as a shared
428 ;; library: "sip_account/sip_empty_offer.cpp:228:1: error: no
429 ;; declaration matches ‘void
430 ;; jami::test::SipEmptyOfferTest::onCallStateChange(const string&, const
431 ;; string&, jami::test::CallData&)’".
432 #:tests? #f
433 ;; The agent links the daemon binary with libguile, which enables the
434 ;; execution of test plans described in Scheme. It may be useful in
435 ;; user scripts too, until more general purpose Scheme bindings are made
436 ;; available (see: test/agent/README.md).
437 #:configure-flags #~(list "--enable-agent"
438 "--enable-debug"
439 ;; Disable static libraries to avoid
440 ;; installing a 98 MiB archive.
441 "--disable-static")
442 #:make-flags #~(list "V=1") ;build verbosely
443 #:phases
444 #~(modify-phases %standard-phases
445 (add-after 'unpack 'change-directory/maybe
446 (lambda _
447 ;; Allow building from the tarball or a git checkout.
448 (false-if-exception (chdir "daemon")))))))
449 (inputs
450 (list alsa-lib
451 asio
452 dbus-c++
453 eudev
454 ffmpeg-jami
455 guile-3.0
456 jack-1
457 jsoncpp
458 libarchive
459 libgit2
460 libnatpmp
461 libsecp256k1
462 libupnp
463 opendht
464 openssl
465 pjproject-jami
466 pulseaudio
467 speex
468 speexdsp
469 webrtc-audio-processing
470 yaml-cpp))
471 (native-inputs
472 (list autoconf
473 automake
474 cppunit
475 libtool
476 perl ;to generate manpages with pod2man
477 pkg-config
478 which))
479 (synopsis "Jami core library and daemon")
480 (description "This package provides a library and daemon implementing the
481 Jami core functionality. Jami is a secure and distributed voice, video and
482 chat communication platform that requires no centralized server and leaves the
483 power of privacy in the hands of the user. It supports the SIP and IAX
484 protocols, as well as decentralized calling using P2P-DHT.")
485 (home-page "https://jami.net/")
486 (license license:gpl3+)))
487
488 ;;; Remove when 2023 comes.
489 (define-public libring
490 (deprecated-package "libring" libjami))
491
492 (define-public jami
493 (package
494 (name "jami")
495 (version %jami-version)
496 (source %jami-sources)
497 (build-system qt-build-system)
498 (outputs '("out" "debug"))
499 (arguments
500 (list
501 #:qtbase qtbase
502 #:tests? #f ;see comment below
503 #:configure-flags
504 ;; The test suite fails to build with:
505 ;; "../../../client-qt/src/app/utils.h:29:10: fatal error: QLabel: No
506 ;; such file or directory".
507 #~(list "-DENABLE_TESTS=OFF"
508 "-DWITH_WEBENGINE=OFF" ;reduce transitive closure size by 450 MiB
509 ;; Use libwrap to link directly to libjami instead of
510 ;; communicating via D-Bus to jamid, the Jami daemon.
511 "-DENABLE_LIBWRAP=ON"
512 (string-append "-DLIBJAMI_XML_INTERFACES_DIR="
513 #$(this-package-input "libjami")
514 "/share/dbus-1/interfaces")
515 (string-append "-DLIBJAMI_INCLUDE_DIR="
516 #$(this-package-input "libjami") "/include/jami"))
517 #:phases
518 #~(modify-phases %standard-phases
519 (add-after 'unpack 'change-directory/maybe
520 (lambda _
521 ;; Allow building from the tarball or a git checkout.
522 (false-if-exception (chdir "client-qt"))))
523 (add-after 'change-directory/maybe 'fix-version-string
524 (lambda _
525 (substitute* "src/app/version.h"
526 (("VERSION_STRING")
527 "BUILD_DATE") ;to avoid a redefinition error
528 (("// clang-format on.*" anchor)
529 (string-append "const char VERSION_STRING[] = \""
530 #$version "\";\n"
531 anchor)))))
532 (add-after 'change-directory/maybe 'patch-source
533 (lambda _
534 (substitute* "src/libclient/CMakeLists.txt"
535 ;; Fix submitted upstream (see:
536 ;; https://review.jami.net/c/jami-client-qt/+/21830).
537 (("target_link_libraries\\(\\$\\{LIBCLIENT_NAME} qtwrapper.*" all)
538 (string-append
539 all " target_link_libraries(${LIBCLIENT_NAME} avutil)\n"))))))))
540 (native-inputs
541 (list googletest
542 pkg-config
543 python
544 qttools
545 doxygen
546 graphviz
547 vulkan-headers))
548 (inputs
549 (list ffmpeg-jami
550 libjami
551 libnotify
552 libxkbcommon
553 network-manager
554 qrencode
555 qt5compat
556 qtdeclarative
557 qtmultimedia
558 qtnetworkauth
559 qtpositioning
560 qtsvg
561 vulkan-loader))
562 (home-page "https://jami.net")
563 (synopsis "Qt Jami client")
564 (description "This package provides the Jami Qt client. Jami is a secure
565 and distributed voice, video and chat communication platform that requires no
566 centralized server and leaves the power of privacy in the hands of the user.
567 It supports the SIP and IAX protocols, as well as decentralized calling using
568 P2P-DHT.")
569 (license license:gpl3+)))
570
571 ;;; Remove when 2023 comes.
572 (define-public jami-gnome
573 (deprecated-package "jami-gnome" jami))
574
575 ;;; Remove when 2023 comes.
576 (define-public jami-qt
577 (deprecated-package "jami-qt" jami))