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>
7 ;;; This file is part of GNU Guix.
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.
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.
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/>.
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))
69 (define %jami-version "20220825.0828.c10f01f")
72 ;; Return an origin object of the tarball release sources archive of the
76 (uri (string-append "https://dl.jami.net/release/tarballs/jami_"
79 (modules '((guix build utils)))
82 ;; Delete multiple MiBs of bundled tarballs. The contrib directory
83 ;; contains the custom patches for pjproject and other libraries used
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"
93 "1iv06jb66g206qxm75v7rc3mqvrml1028avflsj11chj8jh63j14"))
94 (patches (search-patches "jami-fix-crash-on-block-contact.patch"))))
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/"
110 (invoke "patch" "--force" "--ignore-whitespace" "-p1" "-i"
111 (string-append patches-directory "/"
115 (define-public pjproject-jami
116 (let ((commit "5e478bbf8692f43059de9c6ad654b377359baaa0")
120 (name "pjproject-jami")
121 (version (git-version "2.12" revision commit))
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.
131 (url "https://github.com/savoirfairelinux/pjproject")
133 (file-name (git-file-name name version))
136 "0n9hyqr57hhbmq35iqq5ihavj22gxzsspv0f8i6ajxwd4029nmcl"))))
138 (substitute-keyword-arguments (package-arguments pjproject)
139 ((#:phases phases '%standard-phases)
140 #~(modify-phases #$phases
141 (add-after 'unpack 'apply-patches
143 (#$jami-apply-custom-patches
144 #:dep-name "pjproject"
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")))))))))))
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"
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"
175 ;; Enable muxers/demuxers.
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"
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"
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"
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"
259 "--enable-encoder=libspeex"
260 "--enable-decoder=libspeex"
261 "--enable-encoder=libopus"
262 "--enable-decoder=libopus"
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"
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"
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"))
325 (define %ffmpeg-linux-configure-flags
327 "--extra-cxxflags=-fPIC"
328 "--extra-cflags=-fPIC"
330 "--enable-indev=v4l2"
331 "--enable-indev=xcbgrab"
333 "--enable-hwaccel=h264_vdpau"
334 "--enable-hwaccel=mpeg4_vdpau"
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"))
347 ;; ffnvcodec is not supported on ARM; enable it only for the i386 and x86_64
349 (define %ffmpeg-linux-x86-configure-flags
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"))
362 ;; This procedure composes the configure flags list for ffmpeg-jami.
363 (define (ffmpeg-compose-configure-flags)
365 (string-prefix? s (%current-system)))
367 `(,@%ffmpeg-default-configure-flags
368 ,@(if (string-contains (%current-system) "linux")
369 (if (or (system=? "i686")
371 (append %ffmpeg-linux-configure-flags
372 %ffmpeg-linux-x86-configure-flags)
373 %ffmpeg-linux-configure-flags)
376 (define-public ffmpeg-jami
380 ;; XXX: Use a slightly older version, otherwise the
381 ;; 'libopusdec-enable-FEC' patch doesn't apply.
385 (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
389 "0yq0jcdc4qm5znrzylj3dsicrkk2n3n8bv28vr0a506fb7iglbpg"))))
391 (substitute-keyword-arguments (package-arguments ffmpeg-5)
392 ((#:configure-flags '())
393 (ffmpeg-compose-configure-flags))
395 #~(modify-phases #$phases
396 (add-after 'unpack 'apply-patches
398 ;; These patches come from:
399 ;; "jami-project/daemon/contrib/src/ffmpeg/rules.mak".
400 (#$jami-apply-custom-patches
402 #:patches '("remove-mjpeg-log"
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
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")
416 (("fate-lavf-mov_rtphint:.*") ""))))))))))
418 (define-public libjami
421 (version %jami-version)
422 (source %jami-sources)
423 (outputs '("out" "debug"))
424 (build-system gnu-build-system)
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&)’".
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"
439 ;; Disable static libraries to avoid
440 ;; installing a 98 MiB archive.
442 #:make-flags #~(list "V=1") ;build verbosely
444 #~(modify-phases %standard-phases
445 (add-after 'unpack 'change-directory/maybe
447 ;; Allow building from the tarball or a git checkout.
448 (false-if-exception (chdir "daemon")))))))
469 webrtc-audio-processing
476 perl ;to generate manpages with pod2man
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+)))
488 ;;; Remove when 2023 comes.
489 (define-public libring
490 (deprecated-package "libring" libjami))
495 (version %jami-version)
496 (source %jami-sources)
497 (build-system qt-build-system)
498 (outputs '("out" "debug"))
502 #:tests? #f ;see comment below
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"))
518 #~(modify-phases %standard-phases
519 (add-after 'unpack 'change-directory/maybe
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
525 (substitute* "src/app/version.h"
527 "BUILD_DATE") ;to avoid a redefinition error
528 (("// clang-format on.*" anchor)
529 (string-append "const char VERSION_STRING[] = \""
532 (add-after 'change-directory/maybe 'patch-source
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)
539 all " target_link_libraries(${LIBCLIENT_NAME} avutil)\n"))))))))
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
569 (license license:gpl3+)))
571 ;;; Remove when 2023 comes.
572 (define-public jami-gnome
573 (deprecated-package "jami-gnome" jami))
575 ;;; Remove when 2023 comes.
576 (define-public jami-qt
577 (deprecated-package "jami-qt" jami))