{ stdenv , lib , pkg-config , fetchFromGitLab , gitUpdater , ffmpeg_6 # for daemon , autoreconfHook , perl # for pod2man , alsa-lib , asio , dbus , sdbus-cpp , fmt , gmp , gnutls , http-parser , jack , jsoncpp , libarchive , libgit2 , libnatpmp , libpulseaudio , libupnp , yaml-cpp , msgpack-cxx , openssl , restinio , secp256k1 , speex , udev , webrtc-audio-processing , zlib # for client , cmake , git , networkmanager # for libnm , python3 , qttools # for translations , wrapQtAppsHook , libnotify , qt5compat , qtbase , qtdeclarative , qrencode , qtmultimedia , qtnetworkauth , qtpositioning , qtsvg , qtwebengine , qtwebchannel , wrapGAppsHook3 , withWebengine ? true # for pjsip , fetchFromGitHub , pjsip # for opendht , opendht }: stdenv.mkDerivation rec { pname = "jami"; version = "20240430.0"; src = fetchFromGitLab { domain = "git.jami.net"; owner = "savoirfairelinux"; repo = "jami-client-qt"; rev = "stable/${version}"; hash = "sha256-v7558m2h3RqvLLhf3BdYO9LKCFKuMTtPIXgH6OXiiY4="; fetchSubmodules = true; }; pjsip-jami = pjsip.overrideAttrs (old: rec { version = "797f1a38cc1066acc4adc9561aa1288afabe72d5"; src = fetchFromGitHub { owner = "savoirfairelinux"; repo = "pjproject"; rev = version; hash = "sha256-lTDbJF09R2G+EIkMj1YyKa4XokH9LlcIG+RhRJhzUes="; }; configureFlags = [ "--disable-sound" "--enable-video" "--enable-ext-sound" "--disable-speex-aec" "--disable-g711-codec" "--disable-l16-codec" "--disable-gsm-codec" "--disable-g722-codec" "--disable-g7221-codec" "--disable-speex-codec" "--disable-ilbc-codec" "--disable-opencore-amr" "--disable-silk" "--disable-sdl" "--disable-ffmpeg" "--disable-v4l2" "--disable-openh264" "--disable-resample" "--disable-libwebrtc" "--with-gnutls=yes" ] ++ lib.optionals stdenv.isLinux [ "--enable-epoll" ]; buildInputs = old.buildInputs ++ [ gnutls ]; }); opendht-jami = (opendht.overrideAttrs { src = fetchFromGitHub { owner = "savoirfairelinux"; repo = "opendht"; rev = "f2cee8e9ce24746caa7dee1847829c526d340284"; hash = "sha256-ZnIrlybF3MCiXxxv80tRzCJ5CJ54S42prGUjq1suJNA="; }; }).override { enableProxyServerAndClient = true; enablePushNotifications = true; }; dhtnet = stdenv.mkDerivation { pname = "dhtnet"; version = "unstable-2022-04-26"; src = fetchFromGitLab { domain = "git.jami.net"; owner = "savoirfairelinux"; repo = "dhtnet"; rev = "d7976982d24867c6faaf8103504ec8a10d932fa0"; hash = "sha256-vazFDMIu/3AWeOz0LZhZD9NFO8cd5AK41zBpqpQrqnc="; }; nativeBuildInputs = [ cmake pkg-config ]; buildInputs = [ asio fmt gnutls http-parser jsoncpp libupnp msgpack-cxx opendht-jami openssl pjsip-jami python3 restinio ]; cmakeFlags = [ "-DBUILD_SHARED_LIBS=Off" "-DBUILD_BENCHMARKS=Off" "-DBUILD_TOOLS=Off" "-DBUILD_TESTING=Off" ]; meta = with lib; { description = "Lightweight Peer-to-Peer Communication Library"; license = licenses.gpl3Only; platforms = platforms.linux; maintainers = [ maintainers.linsui ]; }; }; daemon = stdenv.mkDerivation { pname = "jami-daemon"; inherit src version meta; sourceRoot = "${src.name}/daemon"; nativeBuildInputs = [ autoreconfHook pkg-config perl ]; buildInputs = [ alsa-lib asio dbus dhtnet sdbus-cpp fmt ffmpeg_6 gmp gnutls http-parser jack jsoncpp libarchive libgit2 libnatpmp libpulseaudio libupnp yaml-cpp msgpack-cxx opendht-jami openssl pjsip-jami restinio secp256k1 speex udev webrtc-audio-processing zlib ]; enableParallelBuilding = true; }; qwindowkit = fetchFromGitHub { owner = "stdware"; repo = "qwindowkit"; rev = "79b1f3110754f9c21af2d7dacbd07b1a9dbaf6ef"; hash = "sha256-iZfmv3ADVjHf47HPK/FdrfeAzrXbxbjH3H5MFVg/ZWE="; fetchSubmodules = true; }; postPatch = '' sed -i -e '/GIT_REPOSITORY/,+1c SOURCE_DIR ''${CMAKE_CURRENT_SOURCE_DIR}/qwindowkit' extras/build/cmake/contrib_tools.cmake sed -i -e 's/if(DISTRO_NEEDS_QMSETUP_PATCH)/if(TRUE)/' CMakeLists.txt cp -R --no-preserve=mode,ownership ${qwindowkit} qwindowkit ''; preConfigure = '' echo 'const char VERSION_STRING[] = "${version}";' > src/app/version.h # Currently the daemon is still built seperately but jami expects it in CMAKE_INSTALL_PREFIX # This can be removed in future versions when JAMICORE_AS_SUBDIR is on mkdir -p $out ln -s ${daemon} $out/daemon ''; dontWrapGApps = true; nativeBuildInputs = [ wrapGAppsHook3 wrapQtAppsHook pkg-config cmake git python3 qttools ]; buildInputs = [ ffmpeg_6 libnotify networkmanager qtbase qt5compat qrencode qtnetworkauth qtdeclarative qtmultimedia qtpositioning qtsvg qtwebchannel ] ++ lib.optionals withWebengine [ qtwebengine ]; cmakeFlags = lib.optionals (!withWebengine) [ "-DWITH_WEBENGINE=false" ]; qtWrapperArgs = [ # With wayland the titlebar is not themed and the wmclass is wrong. "--set-default QT_QPA_PLATFORM xcb" ]; preFixup = '' qtWrapperArgs+=("''${gappsWrapperArgs[@]}") ''; passthru.updateScript = gitUpdater { rev-prefix = "stable/"; }; meta = with lib; { homepage = "https://jami.net/"; description = "The free and universal communication platform that respects the privacy and freedoms of its users"; mainProgram = "jami"; license = licenses.gpl3Plus; platforms = platforms.linux; maintainers = [ maintainers.linsui ]; }; }