From 3349b7deff242d1f61569bac27f054cdfa061069 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 1 Dec 2022 16:37:19 -0500
Subject: [PATCH] packaging: migrate packaging scripts in client-qt

This patch moves already existing packaging scripts from jami-project
into client-qt.
Introduced changes are:
+ WITH_SUBMODULE must search in system lib too because for
packaging client-qt (for rpm) will be built separately, and will
depend on jami-daemon.
+ Fix appdata.xml (replace old wiki with docs.jami.net)
+ path changes (because we build in client-qt not jami-project).

GitLab: #853
Change-Id: I1313830d85c8094fcbcc52e22033a2add7b1e89f
---
 INSTALL.md                                    |   2 +-
 extras/build/cmake/modules/FindLibJami.cmake  |   5 +
 extras/data/jami.appdata.xml                  |   6 +-
 extras/packaging/gnu-linux/Jenkinsfile        | 257 ++++++++++++
 extras/packaging/gnu-linux/Makefile           | 306 ++++++++++++++
 .../gnu-linux/docker/Dockerfile_debian_10     |  46 +++
 .../gnu-linux/docker/Dockerfile_debian_11     |  26 ++
 .../docker/Dockerfile_debian_testing          |  27 ++
 .../docker/Dockerfile_debian_unstable         |  28 ++
 .../gnu-linux/docker/Dockerfile_fedora_36     | 103 +++++
 .../gnu-linux/docker/Dockerfile_fedora_37     | 103 +++++
 .../docker/Dockerfile_opensuse-leap_15.4      | 109 +++++
 .../gnu-linux/docker/Dockerfile_snap          |  84 ++++
 .../gnu-linux/docker/Dockerfile_ubuntu_18.04  |  40 ++
 .../gnu-linux/docker/Dockerfile_ubuntu_20.04  |  29 ++
 .../gnu-linux/docker/Dockerfile_ubuntu_22.04  |  22 +
 .../gnu-linux/docker/Dockerfile_ubuntu_22.10  |  22 +
 extras/packaging/gnu-linux/guix/channels.scm  |   5 +
 .../gnu-linux/guix/guix-pack-deb.postinst     |  97 +++++
 .../gnu-linux/guix/guix-pack-manifest.scm     |  98 +++++
 extras/packaging/gnu-linux/guix/manifest.scm  | 116 ++++++
 .../gnu-linux/guix/minimal-manifest.scm       |  27 ++
 .../gnu-linux/rules/debian-qt/compat          |   1 +
 .../gnu-linux/rules/debian-qt/control         | 390 ++++++++++++++++++
 .../rules/debian-qt/libqt-jami-env.sh         |   8 +
 .../rules/debian-qt/libqt-jami.install        |   2 +
 ...101201-fatal-error-getcurrenkeyboard.patch |  59 +++
 .../gnu-linux/rules/debian-qt/patches/series  |   1 +
 .../packaging/gnu-linux/rules/debian-qt/rules |  33 ++
 .../gnu-linux/rules/debian-qt/source/format   |   1 +
 .../gnu-linux/rules/debian/README.Debian      |  35 ++
 .../packaging/gnu-linux/rules/debian/compat   |   1 +
 .../packaging/gnu-linux/rules/debian/control  | 119 ++++++
 .../gnu-linux/rules/debian/copyright          | 212 ++++++++++
 .../rules/debian/jami-all.lintian-overrides   |   3 +
 .../gnu-linux/rules/debian/jami-all.manpages  |   1 +
 .../gnu-linux/rules/debian/jami-all.postinst  | 168 ++++++++
 .../gnu-linux/rules/debian/jami-all.triggers  |   1 +
 .../rules/debian/jami-daemon.manpages         |   1 +
 .../rules/debian/jami.lintian-overrides       |   3 +
 .../gnu-linux/rules/debian/jami.manpages      |   0
 .../gnu-linux/rules/debian/jami.triggers      |   1 +
 extras/packaging/gnu-linux/rules/debian/rules | 158 +++++++
 .../gnu-linux/rules/debian/source/format      |   1 +
 extras/packaging/gnu-linux/rules/debian/watch |   3 +
 .../gnu-linux/rules/rpm/jami-all.postinst     | 133 ++++++
 .../gnu-linux/rules/rpm/jami-daemon.spec      | 128 ++++++
 .../gnu-linux/rules/rpm/jami-libclient.spec   |  25 ++
 .../gnu-linux/rules/rpm/jami-libqt.spec       |  97 +++++
 .../gnu-linux/rules/rpm/jami-qt.spec          |  26 ++
 .../packaging/gnu-linux/rules/rpm/jami.spec   |  83 ++++
 ...101201-fatal-error-getcurrenkeyboard.patch |  59 +++
 .../rules/snap/common/icons/jami.svg          | 340 +++++++++++++++
 .../rules/snap/common/scripts/jami-wrapper    |   5 +
 .../gnu-linux/rules/snap/jami/snapcraft.yaml  | 367 ++++++++++++++++
 .../gnu-linux/scripts/build-package-debian.sh | 135 ++++++
 .../gnu-linux/scripts/build-package-rpm.sh    | 149 +++++++
 .../gnu-linux/scripts/build-package-snap.sh   |  38 ++
 .../gnu-linux/scripts/deploy-packages.sh      | 332 +++++++++++++++
 .../gnu-linux/scripts/install-cmake.sh        |  15 +
 .../scripts/prebuild-package-debian.sh        |  86 ++++
 extras/packaging/gnu-linux/tarballs.manifest  |  16 +
 62 files changed, 4790 insertions(+), 4 deletions(-)
 create mode 100644 extras/packaging/gnu-linux/Jenkinsfile
 create mode 100644 extras/packaging/gnu-linux/Makefile
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_debian_10
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_debian_11
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_debian_testing
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_debian_unstable
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_fedora_36
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_fedora_37
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_opensuse-leap_15.4
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_snap
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_18.04
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_20.04
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.04
 create mode 100644 extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.10
 create mode 100644 extras/packaging/gnu-linux/guix/channels.scm
 create mode 100644 extras/packaging/gnu-linux/guix/guix-pack-deb.postinst
 create mode 100644 extras/packaging/gnu-linux/guix/guix-pack-manifest.scm
 create mode 100644 extras/packaging/gnu-linux/guix/manifest.scm
 create mode 100644 extras/packaging/gnu-linux/guix/minimal-manifest.scm
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/compat
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/control
 create mode 100755 extras/packaging/gnu-linux/rules/debian-qt/libqt-jami-env.sh
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/libqt-jami.install
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/patches/series
 create mode 100755 extras/packaging/gnu-linux/rules/debian-qt/rules
 create mode 100644 extras/packaging/gnu-linux/rules/debian-qt/source/format
 create mode 100644 extras/packaging/gnu-linux/rules/debian/README.Debian
 create mode 100644 extras/packaging/gnu-linux/rules/debian/compat
 create mode 100644 extras/packaging/gnu-linux/rules/debian/control
 create mode 100644 extras/packaging/gnu-linux/rules/debian/copyright
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami-all.lintian-overrides
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami-all.manpages
 create mode 100755 extras/packaging/gnu-linux/rules/debian/jami-all.postinst
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami-all.triggers
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami-daemon.manpages
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami.lintian-overrides
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami.manpages
 create mode 100644 extras/packaging/gnu-linux/rules/debian/jami.triggers
 create mode 100755 extras/packaging/gnu-linux/rules/debian/rules
 create mode 100644 extras/packaging/gnu-linux/rules/debian/source/format
 create mode 100644 extras/packaging/gnu-linux/rules/debian/watch
 create mode 100755 extras/packaging/gnu-linux/rules/rpm/jami-all.postinst
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/jami-daemon.spec
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/jami-libclient.spec
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/jami-libqt.spec
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/jami-qt.spec
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/jami.spec
 create mode 100644 extras/packaging/gnu-linux/rules/rpm/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
 create mode 100644 extras/packaging/gnu-linux/rules/snap/common/icons/jami.svg
 create mode 100755 extras/packaging/gnu-linux/rules/snap/common/scripts/jami-wrapper
 create mode 100644 extras/packaging/gnu-linux/rules/snap/jami/snapcraft.yaml
 create mode 100755 extras/packaging/gnu-linux/scripts/build-package-debian.sh
 create mode 100755 extras/packaging/gnu-linux/scripts/build-package-rpm.sh
 create mode 100755 extras/packaging/gnu-linux/scripts/build-package-snap.sh
 create mode 100755 extras/packaging/gnu-linux/scripts/deploy-packages.sh
 create mode 100755 extras/packaging/gnu-linux/scripts/install-cmake.sh
 create mode 100755 extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh
 create mode 100644 extras/packaging/gnu-linux/tarballs.manifest

diff --git a/INSTALL.md b/INSTALL.md
index a54595fa7..81bd3c5ef 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -8,7 +8,7 @@ There are essentially two ways to build `client-qt`:
 ## Disclaimer
 
 Because the client-qt is multi-platforms and supporting macOS, we need a recent version of Qt to do rendering with Metal. So, Qt 6.2 is necessary.
-This version is generally not packaged on a lot of platforms, and to control available plugins and such, we have our own Qt packaged (generated by https://review.jami.net/jami-project and available on https://jami.net on the distributions we support).
+This version is generally not packaged on a lot of platforms, and to control available plugins and such, we have our own Qt packaged (available on https://jami.net on the distributions we support).
 So, you will need to get Qt 6.2 first. For this, there is 3 methods:
 
 ### Qt from https://jami.net (recommended)
diff --git a/extras/build/cmake/modules/FindLibJami.cmake b/extras/build/cmake/modules/FindLibJami.cmake
index ddb053190..1e271001e 100644
--- a/extras/build/cmake/modules/FindLibJami.cmake
+++ b/extras/build/cmake/modules/FindLibJami.cmake
@@ -54,6 +54,9 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
 if(WITH_DAEMON_SUBMODULE)
   find_library(LIBJAMI_LIB NAMES jami ring
     PATHS ${DAEMON_DIR}/src/.libs
+    PATHS ${CMAKE_INSTALL_PREFIX}/lib
+    PATHS ${CMAKE_INSTALL_PREFIX}/libexec
+    PATHS ${CMAKE_INSTALL_PREFIX}/bin
     NO_DEFAULT_PATH)
 else()
   # Search only in these given PATHS.
@@ -78,6 +81,8 @@ if(NOT LIBJAMI_LIB)
   if(WITH_DAEMON_SUBMODULE)
     find_library(LIBJAMI_LIB NAMES jami ring
       PATHS ${DAEMON_DIR}/src/.libs
+      PATHS ${CMAKE_INSTALL_PREFIX}/lib
+      PATHS ${CMAKE_INSTALL_PREFIX}/libexec
       NO_DEFAULT_PATH)
   else()
     # Search only in these given PATHS.
diff --git a/extras/data/jami.appdata.xml b/extras/data/jami.appdata.xml
index a9316504b..61defebe0 100644
--- a/extras/data/jami.appdata.xml
+++ b/extras/data/jami.appdata.xml
@@ -58,16 +58,16 @@
       ügyfélalkalmazásai, így a Jami interoperábilis és többplatformos
       kommunikációs keretrendszerré válik.
     </p>
-   
+
  </description>
 
  <url type="homepage">https://jami.net/</url>
  <url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
  <url type="faq">https://jami.net/help/</url>
- <url type="help">https://git.jami.net/savoirfairelinux/jami-project/-/wikis/home</url>
+ <url type="help">https://docs.jami.net</url>
  <url type="donation">https://www.paypal.com/donate/?hosted_button_id=MGUDJLQZ4TP5W</url>
  <url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
- 
+
  <!-- Maximum caption length is 60 characters -->
  <!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
  <screenshots>
diff --git a/extras/packaging/gnu-linux/Jenkinsfile b/extras/packaging/gnu-linux/Jenkinsfile
new file mode 100644
index 000000000..500556a8c
--- /dev/null
+++ b/extras/packaging/gnu-linux/Jenkinsfile
@@ -0,0 +1,257 @@
+// Copyright (C) 2021-2022 Savoir-faire Linux Inc.
+//
+// Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+// Packaging validation for supported GNU/Linux systems.
+//
+// Note: To work on this script without having to push a commit each
+// time, use the jenkins-cli command (see:
+// https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Usage_CLI_de_Jenkins).
+//
+// Requirements:
+// 1. gerrit-trigger plugin
+// 2. ws-cleanup plugin
+// 3. ansicolor plugin
+
+// TODO:
+// - GPG-sign release tarballs.
+// - GPG-sign release commits.
+// - Allow publishing from any node, to avoid relying on a single machine.
+
+// Configuration globals.
+def SUBMODULES = ['daemon', '3rdparty/SortFilterProxyModel', '3rdparty/qrencode-win32', 'extras/packaging/update/sparkle/Sparkle']
+def TARGETS = [:]
+def REMOTE_HOST = env.SSH_HOST_DL_RING_CX
+def REMOTE_BASE_DIR = '/srv/repository/ring'
+def JAMI_PUBLIC_KEY_FINGERPRINT = 'A295D773307D25A33AE72F2F64CD5FA175348F84'
+def GIT_USER_EMAIL = 'jenkins@jami.net'
+def GIT_USER_NAME = 'jenkins'
+def GIT_PUSH_URL = 'ssh://jenkins@review.jami.net:29420/jami-client-qt'
+def JENKINS_SSH_KEY = '35cefd32-dd99-41b0-8312-0b386df306ff'
+def DL_SSH_KEY = '5825b39b-dfc6-435f-918e-12acc1f56221'
+def SNAPCRAFT_KEY = '106e398c-43ca-41c0-8f7e-4f45030f8bdd'
+
+pipeline {
+    agent {
+        label 'guix'
+    }
+
+    options {
+        ansiColor('xterm')
+    }
+
+    parameters {
+        string(name: 'GERRIT_REFSPEC',
+               defaultValue: 'refs/heads/master',
+               description: 'The Gerrit refspec to fetch.')
+        booleanParam(name: 'DEPLOY',
+                     defaultValue: false,
+                     description: 'Whether to deploy packages.')
+        booleanParam(name: 'PUBLISH',
+                     defaultValue: false,
+                     description: 'Whether to upload tarball and push to git.')
+        choice(name: 'CHANNEL',
+               choices: 'internal\nnightly\nstable',
+               description: 'The repository channel to deploy to. ' +
+               'Defaults to "internal".')
+        booleanParam(name: 'BUILD_ARM',
+                     defaultValue: false,
+                     description: 'Whether to build ARM packages.')
+        booleanParam(name: 'BUILD_DEB_PACK',
+                     defaultValue: false,
+                     description: 'Whether to build DEB PACK packages.')
+        string(name: 'PACKAGING_TARGETS',
+               defaultValue: '',
+               description: 'A whitespace-separated list of packaging ' +
+               'targets, e.g. "debian_10 snap". ' +
+               'When left unspecified, all the packaging targets are built.')
+    }
+
+    environment {
+        TARBALLS = '/var/cache/jami' // set the cache directory
+    }
+
+    stages {
+        stage('Check configuration') {
+            steps {
+                script {
+                    if (!fileExists(TARBALLS)) {
+                        error "The ${TARBALLS} directory does not exist. \
+See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
+                    }
+
+                    mountType = sh(script: "findmnt ${TARBALLS} -o fstype -n",
+                                   returnStdout: true)
+                    if (!(mountType =~ /^nfs/)) {
+                        error "The ${TARBALLS} directory is not mounted on NFS storage. \
+See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration_client_NFS"
+                    }
+                }
+            }
+        }
+
+        stage('Configure Git') {
+            steps {
+                sh """git config user.name ${GIT_USER_NAME}
+                      git config user.email ${GIT_USER_EMAIL}
+                   """
+            }
+        }
+
+        stage('Fetch submodules') {
+            steps {
+                echo 'Initializing submodules ' + SUBMODULES.join(', ')
+                sh 'git submodule update --init --recursive'
+            }
+        }
+
+        stage('Generate release tarball') {
+            steps {
+                sh """\
+#!/usr/bin/env -S bash -l
+make -f extras/packaging/gnu-linux/Makefile portable-release-tarball .tarball-version
+"""
+                stash(includes: '*.tar.gz, .tarball-version',
+                      name: 'release-tarball')
+            }
+        }
+
+        stage('Publish release artifacts') {
+            when {
+                expression {
+                    params.PUBLISH && params.CHANNEL != 'internal'
+                }
+            }
+
+            steps {
+                sshagent(credentials: [JENKINS_SSH_KEY, DL_SSH_KEY]) {
+                    echo "Publishing to git repository..."
+                    script {
+                        def tagDate = sh 'date +"%Y%M%d"'
+                        sh """
+                        git tag  -am ${params.CHANNEL}/${tagDate} \"Jami new ${params.CHANNEL} version\"
+                        """
+                        if (params.CHANNEL == 'stable') {
+                            // Only stables releases get tarballs and a tag.
+                            sh 'git push --follow-tags'
+                            echo "Publishing release tarball..."
+                            sh 'rsync --verbose jami*.tar.gz ' +
+                                "${REMOTE_HOST}:${REMOTE_BASE_DIR}" +
+                                "/release/tarballs/"
+                        } else {
+                            sh 'git push --tags'
+                        }
+                    }
+                }
+            }
+        }
+
+        stage('Build packages') {
+            environment {
+                DISABLE_CONTRIB_DOWNLOADS = 'TRUE'
+            }
+            steps {
+                script {
+                    def targetsText = params.PACKAGING_TARGETS.trim()
+                    if (!targetsText) {
+                        targetsText = sh(script: 'make -f extras/packaging/gnu-linux/Makefile -s list-package-targets',
+                                         returnStdout: true).trim()
+                    }
+
+                    TARGETS = targetsText.split(/\s/)
+                    if (!params.BUILD_ARM) {
+                        TARGETS = TARGETS.findAll { !(it =~ /_(armhf|arm64)$/) }
+                    }
+                    if (!params.BUILD_DEB_PACK) {
+                        TARGETS = TARGETS.findAll { !(it =~ /_(deb-pack)$/) }
+                    }
+
+                    def stages = [:]
+
+                    TARGETS.each { target ->
+                        // Note: The stage calls are wrapped in closures, to
+                        // delay their execution.
+                        stages[target] =  {
+                            stage(target) {
+                                // Offload builds to different agents.
+                                node('linux-builder') {
+                                    cleanWs()
+                                    unstash 'release-tarball'
+                                    catchError(buildResult: 'FAILURE',
+                                               stageResult: 'FAILURE') {
+                                        sh """#!/usr/bin/env -S bash -l
+                                           echo Building on node \$NODE_NAME
+                                           whoami
+                                           tar xf *.tar.gz --strip-components=1
+                                           make -f extras/packaging/gnu-linux/Makefile ${target}
+                                           """
+                                        stash(includes: 'extras/packaging/gnu-linux/packages/**',
+                                              name: target)
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    parallel stages
+                }
+            }
+        }
+        stage('Sign & deploy packages') {
+            agent {
+                label 'ring-buildmachine-02.mtl.sfl'
+            }
+
+            when {
+                expression {
+                    params.DEPLOY
+                }
+            }
+
+            steps {
+                sshagent(credentials: [JENKINS_SSH_KEY, DL_SSH_KEY]) {
+                    script {
+                        TARGETS.each { target ->
+                            try {
+                                unstash target
+                            } catch (err) {
+                                echo "Failed to unstash ${target}, skipping..."
+                                return
+                            }
+                        }
+
+                        def distributionsText = sh(
+                            script: 'find extras/packaging/gnu-linux/packages/* -maxdepth 1 -type d -print0 ' +
+                                '| xargs -0 -n1 basename -z',
+                            returnStdout: true).trim()
+                        def distributions = distributionsText.split("\0")
+
+                        distributions.each { distribution ->
+                            echo "Deploying ${distribution} packages..."
+                            withCredentials([string(credentialsId: SNAPCRAFT_KEY, variable: 'SNAPCRAFT_STORE_CREDENTIALS')]) {
+                                sh """extras/packaging/gnu-linux/scripts/deploy-packages.sh \
+  --distribution=${distribution} \
+  --keyid="${JAMI_PUBLIC_KEY_FINGERPRINT}" \
+  --remote-repository-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/${params.CHANNEL}" \
+  --remote-manual-download-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/manual-${params.CHANNEL}"
+"""
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/extras/packaging/gnu-linux/Makefile b/extras/packaging/gnu-linux/Makefile
new file mode 100644
index 000000000..0ad56635e
--- /dev/null
+++ b/extras/packaging/gnu-linux/Makefile
@@ -0,0 +1,306 @@
+# -*- mode: makefile; -*-
+# Copyright (C) 2016-2021 Savoir-faire Linux Inc.
+#
+# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+.DEFAULT_GOAL := package-all
+
+# Default caching directory
+export TARBALLS ?= /var/cache/jami
+
+##############################
+## Version number variables ##
+##############################
+TARBALL_VERSION := $(shell cat $(CURDIR)/.tarball-version 2> /dev/null)
+
+ifeq ($(TARBALL_VERSION),)
+LAST_COMMIT_DATE := $(shell git log -1 --format=%cd --date=format:'%Y%m%d.%H%M')
+COMMIT_ID := $(shell git rev-parse --short HEAD)
+RELEASE_VERSION := $(LAST_COMMIT_DATE).$(COMMIT_ID)
+else
+$(warning Using version from the .tarball-version file: $(TARBALL_VERSION))
+RELEASE_VERSION := $(TARBALL_VERSION)
+endif
+RELEASE_TARBALL_FILENAME := jami_$(RELEASE_VERSION).tar.gz
+
+# Export for consumption in child processes.
+export RELEASE_VERSION
+export RELEASE_TARBALL_FILENAME
+
+# Debian versions
+DEBIAN_VERSION := $(RELEASE_VERSION)~dfsg1-1
+DEBIAN_DSC_FILENAME := jami_$(DEBIAN_VERSION).dsc
+
+# Qt versions
+QT_MAJOR := 6
+QT_MINOR := 2
+QT_PATCH := 3
+QT_TARBALL_CHECKSUM := f784998a159334d1f47617fd51bd0619b9dbfe445184567d2cd7c820ccb12771
+DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-2
+DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
+QT_JAMI_PREFIX := /usr/lib/libqt-jami
+
+#####################
+## Other variables ##
+#####################
+TMPDIR := $(shell mktemp -d)
+CURRENT_UID:=$(shell id -u)
+CURRENT_GID:=$(shell id -g)
+
+#############################
+## Release tarball targets ##
+#############################
+.PHONY: release-tarball purge-release-tarballs portable-release-tarball
+# See: https://reproducible-builds.org/docs/archives/
+TAR_REPRODUCIBILITY_OPTIONS = \
+	--format=gnu \
+	--mtime=@1 \
+	--owner=root:0 \
+	--group=root:0
+
+# This file can be used when not wanting to invoke the tarball
+# producing machinery (which depends on the Git checkout), nor its
+# prerequisites.  It is used to set the TARBALL_VERSION Make variable.
+.tarball-version:
+	echo $(RELEASE_VERSION) > $@
+
+purge-release-tarballs:
+	rm -f jami_*.tar.* tarballs.manifest
+
+release-tarball:
+	rm -f "$(RELEASE_TARBALL_FILENAME)" tarballs.manifest
+	$(MAKE) -f extras/packaging/gnu-linux/Makefile "$(RELEASE_TARBALL_FILENAME)"
+
+# Predicate to check if the 'guix' command is available.
+has-guix-p:
+	command -v guix > /dev/null 2>&1 || \
+	  (echo 'guix' is required to build the '$@' target && exit 1)
+
+# The bundled tarballs included in the release tarball depend on what
+# is available on the host.  To ensure it can be shared across all
+# different GNU/Linux distributions, generate it in a minimal
+# container.  Wget uses GnuTLS, which looks up its certs from
+# /etc/ssl/certs.
+guix-share-tarball-arg = $${TARBALLS:+"--share=$$TARBALLS"}
+portable-release-tarball: has-guix-p
+	guix shell --container --network \
+          --preserve=TARBALLS $(guix-share-tarball-arg) \
+          --expose=/usr/bin/env \
+          --expose=$$SSL_CERT_DIR=/etc/ssl/certs \
+          --manifest=$(CURDIR)/extras/packaging/gnu-linux/guix/minimal-manifest.scm \
+          -- $(MAKE) -f extras/packaging/gnu-linux/Makefile release-tarball
+
+daemon/contrib/native/Makefile:
+	mkdir -p ./daemon/contrib/native && \
+	cd daemon/contrib/native && \
+	../bootstrap
+
+# Fetch the required contrib sources and copy them to
+# daemon/contrib/tarballs.  To use a custom tarballs cache directory,
+# export the TARBALLS environment variable.
+tarballs.manifest: daemon/contrib/native/Makefile
+	cd daemon/contrib/native && \
+	$(MAKE) list && \
+	$(MAKE) fetch -j && \
+	$(MAKE) --no-print-directory --silent list-tarballs > "$(CURDIR)/$@"
+
+ifeq ($(TARBALL_VERSION),)
+# Generate the release tarball.  To regenerate a fresh tarball
+# manually clear the tarballs.manifest file.
+$(RELEASE_TARBALL_FILENAME): tarballs.manifest
+# Prepare the sources of the top repository and relevant submodules.
+	rm -f "$@"
+	mkdir $(TMPDIR)/client-qt
+	git archive HEAD | tar xf - -C $(TMPDIR)/client-qt
+	for m in \
+	    ./daemon \
+	    . \
+	    ./3rdparty/SortFilterProxyModel; do \
+	  (cd "$$m" && git archive --prefix "$$m/" HEAD \
+		| tar xf - -C $(TMPDIR)/client-qt); \
+	done
+# Create the base archive.
+	tar -cf $(TMPDIR)/client-qt.tar $(TMPDIR)/client-qt \
+	  --transform 's,.*/client-qt,client-qt,' \
+	  $(TAR_REPRODUCIBILITY_OPTIONS)
+# Append the cached tarballs listed in the manifest.
+	tar --append --file $(TMPDIR)/client-qt.tar \
+	  --files-from $< \
+	  --transform 's,^.*/,client-qt/daemon/contrib/tarballs/,' \
+          $(TAR_REPRODUCIBILITY_OPTIONS)
+# Compress the tarball and move it into place.
+	gzip --no-name $(TMPDIR)/client-qt.tar
+	mv $(TMPDIR)/client-qt.tar.gz "$@"
+	rm -rf $(TMPDIR)
+else
+# If TARBALL_VERSION is defined, assume it's already been generated,
+# without doing any checks, which would require Git.
+$(RELEASE_TARBALL_FILENAME):
+endif
+
+#######################
+## Packaging targets ##
+#######################
+
+#
+# Traditionally built packages (in Docker containers).
+#
+DISTRIBUTIONS := \
+	debian_10 \
+	debian_11 \
+	debian_testing \
+	debian_unstable \
+	raspbian_10_armhf \
+	ubuntu_18.04 \
+	ubuntu_20.04 \
+	ubuntu_22.04 \
+	ubuntu_22.10 \
+	fedora_35 \
+	fedora_36 \
+	fedora_37 \
+	opensuse-leap_15.3 \
+	opensuse-leap_15.4 \
+	snap
+
+IS_SHELL_INTERACTIVE := $(shell [ -t 0 ] && echo yes)
+
+# The following Make variable can be used to provide extra arguments
+# used with the 'docker run' commands invoked to build the packages.
+DOCKER_RUN_EXTRA_ARGS =
+
+# This function is used to produce the rules of the packaging targets
+# that rely on Docker.
+# Arg1: The name-version string of the distribution (e.g., ubuntu-18.04).
+# Arg2: Extra arguments to pass to 'docker build'.
+# Arg3: Extra arguments to pass to 'docker run'.
+define make-docker-package-target
+$(1)-docker-image-name := jami-packaging-$(1)
+$(1)-docker-image-file := .docker-image-$$($(1)-docker-image-name)
+$(1)-docker-run-command := docker run \
+  --rm --privileged --security-opt apparmor=docker-default \
+  -e RELEASE_VERSION="$(RELEASE_VERSION)" \
+  -e RELEASE_TARBALL_FILENAME="$(RELEASE_TARBALL_FILENAME)" \
+  -e DEBIAN_VERSION="$(DEBIAN_VERSION)" \
+  -e DEBIAN_QT_VERSION="$(DEBIAN_QT_VERSION)" \
+  -e CURRENT_UID="$(CURRENT_UID)" \
+  -e CURRENT_GID="$(CURRENT_GID)" \
+  -e DISTRIBUTION="$(1)" \
+  -e QT_JAMI_PREFIX="$(QT_JAMI_PREFIX)" \
+  -e QT_MAJOR="$(QT_MAJOR)" \
+  -e QT_MINOR="$(QT_MINOR)" \
+  -e QT_PATCH="$(QT_PATCH)" \
+  -e QT_TARBALL_CHECKSUM="$(QT_TARBALL_CHECKSUM)" \
+  -e FORCE_REBUILD_QT="$(FORCE_REBUILD_QT)" \
+  -e SNAP_PKG_NAME="$(or $(SNAP_PKG_NAME),jami)" \
+  -e TARBALLS="$(TARBALLS)" \
+  -v '$(TARBALLS)':'$(TARBALLS)' \
+  -v '$(CURDIR)/$(RELEASE_TARBALL_FILENAME)':'/src/$(RELEASE_TARBALL_FILENAME)' \
+  -v '$(CURDIR)/extras/packaging/gnu-linux/packages/$(1)':/opt/output \
+  -t $(and $(IS_SHELL_INTERACTIVE),-i) \
+  $(3) \
+  "$$($(1)-docker-image-name)"
+
+$$($(1)-docker-image-file): extras/packaging/gnu-linux/docker/Dockerfile_$(1)
+	docker build \
+	  -t $$($(1)-docker-image-name) \
+	  -f extras/packaging/gnu-linux/docker/Dockerfile_$(1) $(2) $(CURDIR) && \
+	touch "$$@"
+
+packages/$(1)/.packages-built: $(RELEASE_TARBALL_FILENAME) $$($(1)-docker-image-file)
+	mkdir -p "$$$$(dirname "$$@")" && \
+	$$($(1)-docker-run-command) && \
+	touch "$$@"
+
+.PHONY: $(1)
+$(1): packages/$(1)/.packages-built
+PACKAGE-TARGETS += $(1)
+
+.PHONY: $(1)-interactive
+$(1)-interactive: $(RELEASE_TARBALL_FILENAME) $$($(1)-docker-image-file)
+	$$($(1)-docker-run-command) bash
+
+endef
+
+$(foreach target,$(DISTRIBUTIONS),\
+	$(eval $(call make-docker-package-target,$(target))))
+
+#
+# Guix-generated Debian packages (deb packs) targets.
+#
+SUPPORTED_GNU_ARCHS = x86_64
+DEB_PACK_TARGETS =
+
+define guix-pack-command
+guix pack -C xz -f deb -m $(CURDIR)/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm -v3 \
+  -S /usr/bin/jami=bin/jami \
+  -S /usr/share/applications/jami.desktop=share/applications/jami.desktop \
+  -S /usr/share/icons/hicolor/scalable/apps/jami.svg=share/icons/hicolor/scalable/apps/jami.svg \
+  -S /usr/share/icons/hicolor/48x48/apps/jami.png=share/icons/hicolor/48x48/apps/jami.png \
+  -S /usr/share/metainfo/jami.appdata.xml=share/metainfo/jami.appdata.xml \
+  --postinst-file=$(CURDIR)/extras/packaging/gnu-linux/guix/guix-pack-deb.postinst
+endef
+
+# Arg1: the GNU architecture type (e.g., x86_64, i686, powerpcle, etc.)
+define define-deb-pack-rule
+deb-file-name := packages/guix-deb-pack/jami-$(RELEASE_VERSION)-$(1).deb
+DEB_PACK_TARGETS += deb-pack-$(subst _,-,$(1))
+.PHONY: deb-pack-$(subst _,-,$(1))
+deb-pack-$(subst _,-,$(1)): $$(deb-file-name)
+$$(deb-file-name): has-guix-p $(RELEASE_TARBALL_FILENAME)
+	output=$$$$($(guix-pack-command) --system=$(1)-linux $$(GUIX_PACK_ARGS)) && \
+	mkdir -p "$$$$(dirname "$$@")" && \
+	cp --reflink=auto "$$$$output" "$$@" && \
+	guix gc --delete "$$$$output"
+	chmod +w "$$@"
+endef
+
+$(foreach arch,$(SUPPORTED_GNU_ARCHS),\
+	$(eval $(call define-deb-pack-rule,$(arch))))
+
+PACKAGE-TARGETS += $(DEB_PACK_TARGETS)
+
+package-all: $(PACKAGE-TARGETS)
+
+.PHONY: list-package-targets
+list-package-targets:
+	@$(foreach p,$(PACKAGE-TARGETS),\
+		echo $(p);)
+
+###################
+## Other targets ##
+###################
+.PHONY: docs
+
+# Build the documentation
+# Note that newly added RST files will likely not display on all documents'
+# navigation bar unless the docs/build folder is manually deleted.
+docs: env
+	env/bin/sphinx-build -b html docs/source docs/build/html
+	env/bin/sphinx-build -b texinfo docs/source docs/build/texinfo
+
+env:
+	virtualenv env
+	env/bin/pip install Sphinx==1.4.1 sphinx-rtd-theme==0.1.9
+
+.PHONY: clean
+clean:
+	rm -rf env
+	rm -rf docs/build
+	rm -f jami_*.tar.gz
+	rm -rf packages
+	rm -f Makefile.packaging.distro_targets
+	rm -f .docker-image-*
+	rm -rf client-qt/daemon/contrib/tarballs/*
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_debian_10 b/extras/packaging/gnu-linux/docker/Dockerfile_debian_10
new file mode 100644
index 000000000..7164588e9
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_debian_10
@@ -0,0 +1,46 @@
+FROM debian:buster
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update -y
+RUN apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        apt-utils \
+        equivs \
+        gcc-8 \
+        g++-8 \
+        clang \
+        clang-tools \
+        libarchive-dev \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 50
+RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
+RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
+RUN apt install nodejs -y
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+
+RUN wget https://ftp.gnu.org/gnu/binutils/binutils-2.37.tar.xz -q -O /tmp/binutils.xz \
+    && cd /tmp/ \
+    && tar xvf binutils.xz \
+    && cd binutils-2.37 \
+    && ./configure \
+    && make \
+    && make install
+
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_debian_11 b/extras/packaging/gnu-linux/docker/Dockerfile_debian_11
new file mode 100644
index 000000000..c033deba3
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_debian_11
@@ -0,0 +1,26 @@
+FROM debian:bullseye
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_debian_testing b/extras/packaging/gnu-linux/docker/Dockerfile_debian_testing
new file mode 100644
index 000000000..327d9d445
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_debian_testing
@@ -0,0 +1,27 @@
+FROM debian:testing
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update --allow-releaseinfo-change && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        wget \
+        nasm
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_debian_unstable b/extras/packaging/gnu-linux/docker/Dockerfile_debian_unstable
new file mode 100644
index 000000000..54228657b
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_debian_unstable
@@ -0,0 +1,28 @@
+FROM debian:unstable
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        libdbus-1-dev \
+        libdbus-c++-dev \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_fedora_36 b/extras/packaging/gnu-linux/docker/Dockerfile_fedora_36
new file mode 100644
index 000000000..e8bc4dc8c
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_fedora_36
@@ -0,0 +1,103 @@
+FROM fedora:36
+
+RUN dnf clean all
+
+RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
+    dnf install -y mock
+
+RUN dnf groupinstall -y "X Software Development"
+
+RUN dnf install -y \
+        git \
+        rpm-build \
+        tar \
+        make \
+        autoconf \
+        automake \
+        nasm \
+        speexdsp-devel \
+        pulseaudio-libs-devel \
+        libcanberra-devel \
+        libcurl-devel \
+        libtool \
+        mesa-libgbm-devel \
+        mesa-dri-drivers \
+        dbus-devel \
+        expat-devel \
+        pcre-devel \
+        yaml-cpp-devel \
+        dbus-c++-devel \
+        dbus-devel \
+        libXext-devel \
+        libXfixes-devel \
+        yasm \
+        python2.7 \
+        speex-devel \
+        gsm-devel \
+        chrpath \
+        check \
+        astyle \
+        uuid-c++-devel \
+        gettext-devel \
+        gcc-c++ \
+        which \
+        alsa-lib-devel \
+        systemd-devel \
+        libuuid-devel \
+        uuid-devel \
+        gnutls-devel \
+        nettle-devel \
+        opus-devel \
+        patch \
+        jsoncpp-devel \
+        libnatpmp-devel \
+        webkitgtk4-devel \
+        cryptopp-devel \
+        libva-devel \
+        libvdpau-devel \
+        msgpack-devel \
+        NetworkManager-libnm-devel \
+        openssl-devel \
+        clutter-devel \
+        clutter-gtk-devel \
+        libappindicator-gtk3-devel \
+        libnotify-devel \
+        libupnp-devel \
+        qrencode-devel \
+        libargon2-devel \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        bison \
+        clang \
+        clang-devel \
+        llvm-devel \
+        nodejs \
+        flex \
+        gstreamer1 gstreamer1-devel \
+        gstreamer1-plugins-base-devel \
+        gstreamer1-plugins-good \
+        gstreamer1-plugins-bad-free-devel \
+        nss-devel \
+        libxcb* \
+        libxkb* \
+        libX11-devel \
+        vulkan-devel \
+        libXrender-devel \
+        xcb-util-* \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        wget \
+        libstdc++-static \
+        sqlite-devel \
+        perl-generators \
+        perl-English \
+        libxshmfence-devel \
+        ninja-build \
+        clang \
+        cmake
+
+ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
+
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_fedora_37 b/extras/packaging/gnu-linux/docker/Dockerfile_fedora_37
new file mode 100644
index 000000000..7a2ac9004
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_fedora_37
@@ -0,0 +1,103 @@
+FROM fedora:37
+
+RUN dnf clean all
+
+RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
+    dnf install -y mock
+
+RUN dnf groupinstall -y "X Software Development"
+
+RUN dnf install -y \
+        git \
+        rpm-build \
+        tar \
+        make \
+        autoconf \
+        automake \
+        nasm \
+        speexdsp-devel \
+        pulseaudio-libs-devel \
+        libcanberra-devel \
+        libcurl-devel \
+        libtool \
+        mesa-libgbm-devel \
+        mesa-dri-drivers \
+        dbus-devel \
+        expat-devel \
+        pcre-devel \
+        yaml-cpp-devel \
+        dbus-c++-devel \
+        dbus-devel \
+        libXext-devel \
+        libXfixes-devel \
+        yasm \
+        python2.7 \
+        speex-devel \
+        gsm-devel \
+        chrpath \
+        check \
+        astyle \
+        uuid-c++-devel \
+        gettext-devel \
+        gcc-c++ \
+        which \
+        alsa-lib-devel \
+        systemd-devel \
+        libuuid-devel \
+        uuid-devel \
+        gnutls-devel \
+        nettle-devel \
+        opus-devel \
+        patch \
+        jsoncpp-devel \
+        libnatpmp-devel \
+        webkitgtk4-devel \
+        cryptopp-devel \
+        libva-devel \
+        libvdpau-devel \
+        msgpack-devel \
+        NetworkManager-libnm-devel \
+        openssl-devel \
+        clutter-devel \
+        clutter-gtk-devel \
+        libappindicator-gtk3-devel \
+        libnotify-devel \
+        libupnp-devel \
+        qrencode-devel \
+        libargon2-devel \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        bison \
+        clang \
+        clang-devel \
+        llvm-devel \
+        nodejs \
+        flex \
+        gstreamer1 gstreamer1-devel \
+        gstreamer1-plugins-base-devel \
+        gstreamer1-plugins-good \
+        gstreamer1-plugins-bad-free-devel \
+        nss-devel \
+        libxcb* \
+        libxkb* \
+        libX11-devel \
+        vulkan-devel \
+        libXrender-devel \
+        xcb-util-* \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        wget \
+        libstdc++-static \
+        sqlite-devel \
+        perl-generators \
+        perl-English \
+        libxshmfence-devel \
+        ninja-build \
+        clang \
+        cmake
+
+ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
+
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_opensuse-leap_15.4 b/extras/packaging/gnu-linux/docker/Dockerfile_opensuse-leap_15.4
new file mode 100644
index 000000000..dce857ab6
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_opensuse-leap_15.4
@@ -0,0 +1,109 @@
+FROM opensuse/leap:15.4
+
+RUN zypper refresh
+
+RUN zypper --non-interactive install -y \
+        dnf \
+        dnf-command\(builddep\) \
+        rpmdevtools \
+        Mesa-dri-devel Mesa-dri \
+        git \
+        gcc10 \
+        gcc10-c++ \
+        rpm-build \
+        tar \
+        make \
+        autoconf \
+        automake \
+        nasm \
+        speexdsp-devel \
+        libpulse-devel \
+        libcanberra-devel \
+        libcurl-devel \
+        libtool \
+        pcre-devel \
+        yaml-cpp-devel \
+        libdbus-c++-devel \
+        libXext-devel \
+        libXfixes-devel \
+        yasm \
+        speex-devel \
+        libgsm-devel \
+        chrpath \
+        check \
+        astyle \
+        gettext-devel \
+        which \
+        alsa-lib-devel \
+        systemd-devel \
+        libuuid-devel \
+        uuid-devel \
+        libopus-devel \
+        patch \
+        jsoncpp-devel \
+        webkit2gtk3-devel \
+        libcryptopp-devel \
+        libva-devel \
+        libvdpau-devel \
+        msgpack-devel \
+        clutter-devel \
+        openssl-devel \
+        clutter-gtk-devel \
+        libnma-devel \
+        libcryptopp-devel \
+        libdbus-c++-devel \
+        libexpat-devel \
+        gnome-icon-theme-symbolic \
+        libgsm-devel \
+        gtk3-devel \
+        libappindicator-devel \
+        sqlite-devel \
+        ffmpeg-4-libavutil-devel \
+        gtk3-devel\
+        qrencode-devel \
+        python3-python-dateutil \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        bison \
+        flex \
+        ffmpeg ffmpeg-devel \
+        nodejs12 \
+        mozilla-nss-devel \
+        python-xml \
+        libxcb* \
+        libxkb* \
+        libX11-devel \
+        libXrender-devel \
+        libfreetype6 \
+        xcb-util-image-devel \
+        xcb-util-keysyms-devel \
+        xcb-util-renderutil-devel \
+        xcb-util-wm-devel \
+        xorg-x11-devel \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        argon2-devel \
+        libxshmfence-devel \
+        xproto-devel \
+        xcb-proto-devel \
+        xcb-* \
+        xorg-* \
+        vulkan-devel \
+        ninja \
+        gstreamer-devel \
+        gstreamer-plugins-good \
+        gstreamer-plugins-bad-devel \
+        gstreamer-plugins-base-devel \
+        cmake \
+        wget
+
+RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 50
+RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 50
+
+ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
+
+ENV CC=gcc
+ENV CXX=g++
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_snap b/extras/packaging/gnu-linux/docker/Dockerfile_snap
new file mode 100644
index 000000000..fe8277da9
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_snap
@@ -0,0 +1,84 @@
+ARG RISK=edge
+ARG UBUNTU=focal
+
+FROM ubuntu:$UBUNTU as builder
+ARG RISK
+ARG UBUNTU
+RUN echo "Building snapcraft:$RISK in ubuntu:$UBUNTU"
+
+# Grab dependencies
+RUN apt-get update
+RUN apt-get dist-upgrade --yes
+RUN apt-get install --yes \
+      curl \
+      jq \
+      squashfs-tools
+
+# Grab the core snap (for backwards compatibility) from the stable channel and
+# unpack it in the proper place.
+RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core' | jq '.download_url' -r) --output core.snap
+RUN mkdir -p /snap/core
+RUN unsquashfs -d /snap/core/current core.snap
+
+# Grab the core22 snap (which snapcraft uses as a base) from the stable channel
+# and unpack it in the proper place.
+RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22?channel='$RISK | jq '.download_url' -r) --output core22.snap
+RUN mkdir -p /snap/core22
+RUN unsquashfs -d /snap/core22/current core22.snap
+
+# Grab the core20 snap (which snapcraft uses as a base) from the stable channel
+# and unpack it in the proper place.
+RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core20' | jq '.download_url' -r) --output core20.snap
+RUN mkdir -p /snap/core20
+RUN unsquashfs -d /snap/core20/current core20.snap
+
+# Grab the core20 snap (which snapcraft uses as a base) from the stable channel
+# and unpack it in the proper place.
+RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/lxd' | jq '.download_url' -r) --output lxd.snap
+RUN mkdir -p /snap/lxd
+RUN unsquashfs -d /snap/lxd/current lxd.snap
+
+# Grab the snapcraft snap from the $RISK channel and unpack it in the proper
+# place.
+RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/snapcraft?channel='$RISK | jq '.download_url' -r) --output snapcraft.snap
+RUN mkdir -p /snap/snapcraft
+RUN unsquashfs -d /snap/snapcraft/current snapcraft.snap
+
+# Fix Python3 installation: Make sure we use the interpreter from
+# the snapcraft snap:
+RUN unlink /snap/snapcraft/current/usr/bin/python3
+RUN ln -s /snap/snapcraft/current/usr/bin/python3.* /snap/snapcraft/current/usr/bin/python3
+RUN echo /snap/snapcraft/current/lib/python3.*/site-packages >> /snap/snapcraft/current/usr/lib/python3/dist-packages/site-packages.pth
+
+# Create a snapcraft runner (TODO: move version detection to the core of
+# snapcraft).
+RUN mkdir -p /snap/bin
+RUN echo "#!/bin/sh" > /snap/bin/snapcraft
+RUN snap_version="$(awk '/^version:/{print $2}' /snap/snapcraft/current/meta/snap.yaml | tr -d \')" && echo "export SNAP_VERSION=\"$snap_version\"" >> /snap/bin/snapcraft
+RUN echo 'exec "$SNAP/usr/bin/python3" "$SNAP/bin/snapcraft" "$@"' >> /snap/bin/snapcraft
+RUN chmod +x /snap/bin/snapcraft
+
+# Multi-stage build, only need the snaps from the builder. Copy them one at a
+# time so they can be cached.
+FROM ubuntu:$UBUNTU
+COPY --from=builder /snap/core /snap/core
+COPY --from=builder /snap/core22 /snap/core22
+COPY --from=builder /snap/core20 /snap/core20
+COPY --from=builder /snap/lxd /snap/lxd
+COPY --from=builder /snap/snapcraft /snap/snapcraft
+COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
+
+# Generate locale and install dependencies.
+RUN apt-get update && apt-get dist-upgrade --yes && apt-get install --yes snapd sudo apt-transport-https locales && locale-gen en_US.UTF-8
+
+# Set the proper environment.
+ENV LANG="en_US.UTF-8"
+ENV LANGUAGE="en_US:en"
+ENV LC_ALL="en_US.UTF-8"
+ENV PATH="/snap/bin:/snap/snapcraft/current/usr/bin:/snap/snapcraft/current/libexec/snapcraft/:$PATH"
+ENV SNAP="/snap/snapcraft/current"
+ENV SNAP_NAME="snapcraft"
+ENV SNAP_ARCH="amd64"
+
+ADD extras/packaging/gnu-linux/scripts/build-package-snap.sh /opt/build-package-snap.sh
+CMD ["/opt/build-package-snap.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_18.04 b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_18.04
new file mode 100644
index 000000000..fab4e9e6e
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_18.04
@@ -0,0 +1,40 @@
+FROM ubuntu:18.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        curl \
+        gcc-8 \
+        g++-8 \
+        clang \
+        clang-tools \
+        libarchive-dev \
+        software-properties-common \
+        wget
+
+# nodejs (more recent version needed for building libqt-jami)
+RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
+RUN apt install nodejs -y
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 50
+RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
+RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_20.04 b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_20.04
new file mode 100644
index 000000000..3c3aba5b7
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_20.04
@@ -0,0 +1,29 @@
+FROM ubuntu:20.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+# Install CMake 3.19 for Qt 6
+ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
+RUN /opt/install-cmake.sh
+# nodejs
+RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
+RUN apt install nodejs -y
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.04 b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.04
new file mode 100644
index 000000000..dbff097d9
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.04
@@ -0,0 +1,22 @@
+FROM ubuntu:22.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.10 b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.10
new file mode 100644
index 000000000..406cace07
--- /dev/null
+++ b/extras/packaging/gnu-linux/docker/Dockerfile_ubuntu_22.10
@@ -0,0 +1,22 @@
+FROM ubuntu:22.10
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        python-is-python3 \
+        wget
+
+ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/extras/packaging/gnu-linux/guix/channels.scm b/extras/packaging/gnu-linux/guix/channels.scm
new file mode 100644
index 000000000..6c333f7eb
--- /dev/null
+++ b/extras/packaging/gnu-linux/guix/channels.scm
@@ -0,0 +1,5 @@
+;;; Tested with this revision of GNU Guix.
+(list (channel
+       (inherit %default-guix-channel)
+       (commit
+        "f5cc7d03a778f20e2ad487e2c17cc8853bc871f0"))) ;2022-08-01
diff --git a/extras/packaging/gnu-linux/guix/guix-pack-deb.postinst b/extras/packaging/gnu-linux/guix/guix-pack-deb.postinst
new file mode 100644
index 000000000..4c6c8ca68
--- /dev/null
+++ b/extras/packaging/gnu-linux/guix/guix-pack-deb.postinst
@@ -0,0 +1,97 @@
+#!/bin/sh
+# Copyright (C) 2021 Savoir-faire Linux Inc.
+#
+# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+set -e
+
+# Fingerprint: A295D773307D25A33AE72F2F64CD5FA175348F84
+jami_key="\
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+mQENBFVSdlcBCAC9zC1rp12O2K08PGozI14Y+t4qC931eHicvkuEMF1B9gAhjdRF
+aIJS+UXwgQzoamDIHenxz1Q3fXUjKCMXytjGymB/0LUKccSbtH0Rcsl8kZ2z57KN
+E+GLS7SvlP93ZOxco7eAEBWF/fvMrCsm10sNI6bW7UK0bgql9iIetd6Wrp9xXFVs
+gmoV8Av714OlswsthSNtN+xQls3ozQ/dVGsOkZEyDbBzi88/rQEtuIDztTSWyD0V
+x7WaY5+mVRwsJKzyPlgvsXpbP7A41IFykeOzPKh+vYz3k7dcLIRdOwse79oT2RXt
+2VYEyTyTZIQlCJjGNTJYsU7GVffU4LnI7p/bABEBAAG0QFJpbmcgLSBTYXZvaXIt
+RmFpcmUgTGludXgsIEluYyA8cmluZ0BsaXN0cy5zYXZvaXJmYWlyZWxpbnV4Lm5l
+dD6JATkEEwEIACMFAlVSdlcCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAK
+CRBkzV+hdTSPhMqSB/9aaKXVByoE7zwPM8DDSntS/jYhhaV1CcZ78WeC1LY2UnHL
+R/yvABnDMikgqbMHBDu1R9dnjgZNntp7p0blxcT6ScxdZ6FpMZG6ZW5YNZIVctnF
+jdExStcdpcbbycW8GeCmQdVcKLBl8G55mick02ayVNOH5ETtWahPwBvMWk5hSaH3
+E18yvnmdqa9nCEST4UKvBOpmn58mwJDIR2YLdEFcL8z4FkxQUNkx/hiHSn+YLorZ
+H3iBrf9y9vSYhQ5pxx7seWkoaGAQBgfktRCUKvVY6E1oSZ/WR1WsR1ftDO/RD0E8
+APKzibVynUEQrCcQX16uDOa/YgavVkts9HmR7Vf7iQEcBBABCAAGBQJVUoJZAAoJ
+EFZ3uE+o8K8j0RkH/2sv4L3X0hPIwAzf3CUJZQuHihUOPRAoru5RqW/5nWqsroa1
+WChJq79uDEecDAizTA1MvaTFmLxTjCkJso+5UHMSHi6LARvYXSOeBPFizEJT4qZZ
+CXti5zh9d5z1u6L986mrnArA39IZ2F+9wV2q0VIDnq1Tt6+cJ745zSeZmbM6jip4
+oEBsKbCkAhq78sqCc7DIilsGbd2tgrLsh3fitvamEJCTCYKdDMog3TP0+EekQTA2
+Qp4jG0Uf7Gg1YvDDcsawXyNDrMBXEFPVhBNnRisX+YQBRWgDE58+fpsQfeTkblL5
+UaLWhDGlyfAc1ebL3InzhUWJswjt0BN3GPoP55m5AQ0EVVJ2VwEIAMXhg0w1IM0C
+rGXMGayaJ3EWd9YXkqq0sAN7b75tD0cOimyPNafnzChG9//3tt82aPRm8fG5Lk5U
+fwCS2MSt2Ml8UZeujmEBnvU9hsJBWcGgzXhtBQwZqzmV2vQg8436nTFY5L24TFBc
+QNOUJNzSy/dqps0SxcYleE57o24KHlW6ICBaEhz0JoZHv5+7GtYz6XN2D7pkwTPY
+UIahyt4dY3geFrkuMzZdTS4qyFb8EE/Ypi/WgewO9ib53kt7FBrxmm0l+d9GR4jH
+CKGqaYjm8xzTsNa3m2C0Cf/C13bOaQVicgntfQ32IjjZdaDMlRLQluYNQ0ETA1FE
+9+EVvrQYZ+kAEQEAAYkBHwQYAQgACQUCVVJ2VwIbDAAKCRBkzV+hdTSPhMIaB/9D
+CrIZBDy7YOK3gdnNm57jemJRz6Cum7RTUiqCQ8ivSmEgv1KmMIqMpjmnKKP43iHO
+mR4i7XDml6RBGynPys6cQcAlBWSuhOv9PGpRCaGyjJ4vmQUsYhyD/+tCDZVdBuGg
+CxteSMbawxtMHESqX7dDlctc+njDjBcbcGj73sj36qoFIjorjymZlT5IdK39oXVM
+Hi1TssiWPOU0hQgn4BIreYnEZUA6xuFX10C7k2DVRFZrXF7lpNgPQ8eNZTnQBIuw
+HUFCGSHO3/kzxSlkE1PBUX3IZ8PSFijyopBnWUhlSXuyRjte8OR7Fl/Rlf0IaOD1
+4sRdAfS333T4Uifq4uOu
+=s2aQ
+-----END PGP PUBLIC KEY BLOCK-----"
+
+# System paths and generated variables.
+apt_file=/etc/apt/sources.list.d/jami.list
+update_manager_path=/etc/update-manager/release-upgrades.d/
+jami_update_manager_id=jami
+jami_update_manager_cfg=${jami_update_manager_id}.cfg
+update_manager_cfg_path=$update_manager_path/$jami_update_manager_cfg
+jami_repo_url=https://dl.jami.net/nightly/guix-deb-pack
+
+case "$1" in
+    configure)
+        command -v apt-key > /dev/null \
+            || (echo 'could not run postinst: apt-key is missing' && exit 1)
+
+        # Add the key to the trusted keyring.
+        echo "$jami_key" | apt-key add - > /dev/null 2>&1
+
+        # Additionally, if update manager is installed we inform it about
+        # the repository so it doesn't get scrapped after system updates
+        if [ -d /etc/update-manager ]; then
+            mkdir -p "$update_manager_path"
+            cat > "$update_manager_cfg_path" <<EOF
+# Added by Jami to prevent disabling of Jami repository sources on
+# distribution release upgrade.
+[ThirdPartyMirrors]
+jami/${jami_update_manager_id}=${jami_repo_url}
+EOF
+        fi
+
+        # Add an entry for the package repository.
+        test -f "$apt_file" && cp "$apt_file" "${apt_file}.bak"
+        echo "deb $jami_repo_url jami main" > "$apt_file"
+        ;;
+esac
+
+# Local Variables:
+# mode: sh
+# End:
diff --git a/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm b/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm
new file mode 100644
index 000000000..8337247f6
--- /dev/null
+++ b/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm
@@ -0,0 +1,98 @@
+;;; Copyright (C) 2021 Savoir-faire Linux Inc.
+;;;
+;;; Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+;;;
+;;; This program is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+;;;
+;;; This GNU Guix manifest is used along the Makefile to build the
+;;; latest Jami as a Guix pack.
+
+(use-modules (gnu packages certs)
+             (gnu packages jami)
+             (gnu packages python)
+             (guix base32)
+             (guix gexp)
+             (guix packages)
+             (guix transformations)
+             (guix store)
+             (guix utils))
+
+;;; XXX: Below is a rather strenuous way to specify something that
+;;; would have been nicer if it could have been specified via:
+;;;
+;;; --with-source=libjami=$(RELEASE_TARBALL_FILENAME) \
+;;; --with-source=jami=$(RELEASE_TARBALL_FILENAME) in the Makefile.
+;;;
+;;; The above doesn't currently rewrite the dependency graph
+;;; recursively, hence why it is not sufficient.
+
+(define %release-version (getenv "RELEASE_VERSION"))
+
+(define %release-file-name (getenv "RELEASE_TARBALL_FILENAME"))
+
+(unless %release-version
+  (error "RELEASE_VERSION environment variable is not set"))
+
+(unless %release-file-name
+  (error "RELEASE_TARBALL_FILENAME environment variable is not set"))
+
+;;; Add the source tarball to the store and retrieve its hash.  The
+;;; hash is useful to turn the origin record into a fixed-output
+;;; derivation, which means the Jami packages will only get built once
+;;; for a given source tarball.
+(define %release-file-hash
+  (with-store store
+    (let ((source (add-to-store store (basename %release-file-name) #f
+                                "sha256" %release-file-name)))
+      (bytevector->nix-base32-string (query-path-hash store source)))))
+
+(define %jami-sources/latest
+  (origin
+    (inherit (@@ (gnu packages jami) %jami-sources))
+    (uri %release-file-name)
+    (sha256 %release-file-hash)))
+
+(define (with-latest-sources name)
+  (options->transformation
+   `((with-source . ,(format #f "~a@~a=~a" name
+                             %release-version %release-file-name)))))
+
+(define libjami/latest ((with-latest-sources "libjami") libjami))
+
+(define with-libjami/latest
+  (package-input-rewriting `((,libjami . ,libjami/latest))))
+
+;;; Bundling the TLS certificates with Jami enables a fully
+;;; functional, configuration-free experience, useful in the context
+;;; of Guix packs.
+(define jami-with-certs
+  (package/inherit jami
+    (inputs (modify-inputs (package-inputs jami)
+              (append nss-certs)))
+    (arguments
+     (substitute-keyword-arguments (package-arguments jami)
+       ((#:phases phases '%standard-phases)
+        #~(modify-phases #$phases
+            (add-after 'qt-wrap 'wrap-ssl-cert-dir
+              (lambda* (#:key inputs outputs #:allow-other-keys)
+                (substitute* (search-input-file outputs "bin/jami")
+                  (("^exec.*" exec-line)
+                   (format #f "export SSL_CERT_DIR=~a~%"
+                           (search-input-directory inputs "etc/ssl/certs")
+                           exec-line)))))))))))
+
+(define jami-with-certs/latest
+  ((with-latest-sources "jami") jami-with-certs))
+
+(packages->manifest (list jami-with-certs/latest))
diff --git a/extras/packaging/gnu-linux/guix/manifest.scm b/extras/packaging/gnu-linux/guix/manifest.scm
new file mode 100644
index 000000000..59f2a831f
--- /dev/null
+++ b/extras/packaging/gnu-linux/guix/manifest.scm
@@ -0,0 +1,116 @@
+;;; To use with the GNU Guix package manager.
+;;; Available at https://guix.gnu.org/.
+;;;
+;;; Commentary:
+;;;
+;;; A full-blown development environment that can be used to build the
+;;; whole project.  The sensitive (i.e., patched) dependencies are
+;;; consciously omitted from this list so that the bundled libraries
+;;; are the ones used, which is usually what is desired for
+;;; development purposes.
+
+;;; The build.py script makes use of it to build Jami in a Linux
+;;; container with the dependencies below when Guix is detected (and
+;;; no /etc/os-release file exists) or when explicitly specified,
+;;; e.g.:
+;;;
+;;; $ ./build.py --distribution=guix --install
+;;;
+;;; It can also be invoked directly to spawn a development environment, like so:
+;;;
+;;; $ guix shell --pure --manifest=guix/manifest.scm
+
+(specifications->manifest
+ (list
+  ;; Minimal requirements of the daemon contrib build system.
+  "coreutils"
+  "gcc-toolchain"
+  "git-minimal"
+  "grep"
+  "gzip"
+  "make"
+  "nss-certs"
+  "pkg-config"
+  "python"
+  "sed"
+  "tar"
+  "util-linux"
+  "wget"
+  "xz"
+
+  ;; For the daemon and its contribs.
+  "alsa-lib"
+  "autoconf"
+  "automake"
+  "bash"
+  "bzip2"
+  "cmake"
+  "dbus"
+  ;; Bundled because broken with GCC 7 upstream (unmaintained).  When
+  ;; attempting to use it, it would cause confusing errors such as
+  ;; "ld: ../src/.libs/libring.a(libupnpcontrol_la-upnp_context.o): in
+  ;; function `jami::upnp::UPnPContext::updateMappingList(bool)':
+  ;; upnp_context.cpp:(.text+0xa4be): undefined reference to
+  ;; `std::__cxx11::basic_ostringstream<char, std::char_traits<char>,
+  ;; std::allocator<char> >::basic_ostringstream()'
+  ;;"dbus-c++"                          ;for dbusxx-xml2cpp
+  "diffutils"
+  "doxygen"
+  "eudev"                               ;udev library
+  "expat"
+  "findutils"
+  "gawk"
+  "gettext"
+  "gnutls"
+  ;;"ffmpeg"                            ;bundled because patched
+  "gmp"
+  "gsm"
+  "gtk-doc"
+  "http-parser"
+  "jsoncpp"
+  "libarchive"
+  "libgit2"
+  "libnatpmp"
+  "libupnp"
+  "libsecp256k1"
+  "libtool"
+  "libva"                               ;vaapi
+  "libvdpau"
+  "libx264"
+  "nasm"
+  "nettle"
+  "openssl"
+  "opus"
+  "patch"
+  "pcre"
+  "perl"
+  ;;"pjproject"                         ;bundled because patched
+  "pulseaudio"
+  "speex"
+  "speexdsp"
+  "which"
+  "yaml-cpp"
+  "yasm"
+
+  ;; For the Qt client.
+  "libxkbcommon"
+  "network-manager"                     ;libnm
+  "qrencode"
+  "qtbase"
+  "qt5compat"
+  "qtdeclarative"
+  "qtmultimedia"
+  "qtnetworkauth"
+  "qtpositioning"
+  "qtsvg"
+  "qttools"
+  "qtwebchannel"
+  "qtwebengine"
+  "vulkan-headers"
+
+  ;; For tests and debugging.
+  "file"
+  "gdb"
+  "googletest"
+  "ltrace"
+  "strace"))
diff --git a/extras/packaging/gnu-linux/guix/minimal-manifest.scm b/extras/packaging/gnu-linux/guix/minimal-manifest.scm
new file mode 100644
index 000000000..c970c696b
--- /dev/null
+++ b/extras/packaging/gnu-linux/guix/minimal-manifest.scm
@@ -0,0 +1,27 @@
+;;; To use with the GNU Guix package manager.
+;;; Available at https://guix.gnu.org/.
+;;;
+;;; Commentary:
+;;;
+;;; This Guix manifest can be used to create an environment that
+;;; satisfies the minimal requirements of the the contrib build system
+;;; of the daemon.  For example, it is used by the CI to build the
+;;; source release tarball in a controlled environment.
+
+(specifications->manifest
+ (list
+  "bash"
+  "coreutils"
+  "gcc-toolchain"
+  "git-minimal"
+  "grep"
+  "gzip"
+  "make"
+  "nss-certs"
+  "pkg-config"
+  "python"
+  "sed"
+  "tar"
+  "util-linux"
+  "wget"
+  "xz"))
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/compat b/extras/packaging/gnu-linux/rules/debian-qt/compat
new file mode 100644
index 000000000..9a037142a
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/compat
@@ -0,0 +1 @@
+10
\ No newline at end of file
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/control b/extras/packaging/gnu-linux/rules/debian-qt/control
new file mode 100644
index 000000000..d337bfbd6
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/control
@@ -0,0 +1,390 @@
+Source: libqt-jami
+Section: libs
+Priority: optional
+Maintainer: The Jami project <jami@gnu.org>
+Rules-Requires-Root: no
+Standards-Version: 4.5.1
+Build-Depends: debhelper (>= 9),
+# =====================================================
+# the following list of deps was gathered with help
+# from https://salsa.debian.org/qt-kde-team/qt repos
+# =====================================================
+#
+# ======
+# qtbase
+# ======
+# debhelper-compat (= 13),
+# debhelper,
+               default-libmysqlclient-dev,
+               dh-exec,
+# dpkg-dev (>= 1.17.14),
+               dpkg-dev,
+               firebird-dev [kfreebsd-any linux-any],
+               freetds-dev,
+               libasound2-dev [linux-any],
+               libatspi2.0-dev,
+               libcups2-dev,
+               libdbus-1-dev,
+               libdouble-conversion-dev,
+               libdrm-dev [linux-any],
+               libfontconfig1-dev,
+               libfreetype6-dev,
+               libgbm-dev [linux-any kfreebsd-any],
+               libgl-dev,
+# libgles-dev, (not available in buster)
+               libglib2.0-dev,
+# libglu1-mesa-dev | libglu-dev,
+               libgtk-3-dev,
+               libharfbuzz-dev (>= 1.6.0~),
+               libicu-dev,
+               libinput-dev [linux-any],
+               libjpeg-dev,
+               libkrb5-dev,
+# libmd4c-dev, (not in buster)
+               libmtdev-dev [linux-any],
+               libpcre2-dev,
+               libpng-dev,
+               libpq-dev,
+               libproxy-dev,
+               libpulse-dev,
+               libsqlite3-dev,
+               libssl-dev,
+               libudev-dev [linux-any],
+               libvulkan-dev [linux-any],
+               libx11-dev,
+               libx11-xcb-dev,
+               libxcb-glx0-dev,
+               libxcb-icccm4-dev,
+               libxcb-image0-dev,
+               libxcb-keysyms1-dev,
+               libxcb-randr0-dev,
+               libxcb-render-util0-dev,
+               libxcb-render0-dev,
+               libxcb-shape0-dev,
+               libxcb-shm0-dev,
+               libxcb-sync-dev,
+               libxcb-util0-dev,
+               libxcb-xfixes0-dev,
+               libxcb-xinerama0-dev,
+               libxcb-xinput-dev,
+               libxcb-xkb-dev,
+               libxcb1-dev,
+               libxext-dev,
+               libxi-dev,
+               libxkbcommon-dev,
+               libxkbfile-dev,
+               libxkbcommon-x11-dev,
+               libxrender-dev,
+               libzstd-dev,
+               libxshmfence-dev,
+               pkg-config,
+# pkg-kde-tools (>= 0.15.17~),
+               publicsuffix,
+# qt5-qmake-bin <cross>,
+               unixodbc-dev,
+               zlib1g-dev,
+# =============
+# qtdeclarative
+# =============
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.20.0),
+               libgl1-mesa-dri,
+# pkg-kde-tools (>= 0.15.17~),
+               python3:any,
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+               xauth <!nocheck>,
+               xvfb <!nocheck>,
+# ==================
+# qtgraphicaleffects
+# ==================
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.16.1),
+# pkg-kde-tools (>= 0.15.26~),
+# qml-module-qtquick-window2 (>= 5.15.2+dfsg~),
+# qml-module-qtquick2 (>= 5.15.2+dfsg~),
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev-tools (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# ============
+# qtmultimedia
+# ============
+# debhelper-compat (= 13),
+# libasound2-dev [linux-any],
+               libgstreamer-plugins-base1.0-dev,
+               libgstreamer1.0-dev,
+               libopenal-dev,
+# libpulse-dev,
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# pkg-kde-tools,
+# qml-module-qtquick2,
+# qml-module-qttest,
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev (>= 5.15.2+dfsg~),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# zlib1g-dev,
+# =========================
+# qtlocation (for qtwebkit)
+# =========================
+# debhelper-compat (= 13),
+               libboost-dev,
+# libicu-dev,
+               libprotozero-dev (>= 1.5.2),
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# pkg-kde-tools,
+# qml-module-qttest (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+               rapidjson-dev (>= 1.1.0),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# zlib1g-dev,
+# ===============
+# qtquickcontrols
+# ===============
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.17.14),
+# pkg-kde-tools (>= 0.15.26~),
+# qml-module-qt-labs-folderlistmodel (>= 5.15.2+dfsg~),
+# qml-module-qt-labs-settings (>= 5.15.2+dfsg~),
+# qml-module-qtgraphicaleffects (>= 5.15.2~),
+# qml-module-qtqml (>= 5.15.2+dfsg~),
+# qml-module-qtqml-models2 (>= 5.15.2+dfsg~),
+# qml-module-qtquick-layouts (>= 5.15.2+dfsg~),
+# qml-module-qtquick-window2 (>= 5.15.2+dfsg~),
+# qml-module-qttest (>= 5.15.2+dfsg~),
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev-tools (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# ========================
+# qtsensors (for qtwebkit)
+# ========================
+# debhelper-compat (= 13),
+# pkg-kde-tools,
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev (>= 5.15.2+dfsg~),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# ================
+# qtquickcontrols2
+# ================
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.16.1),
+# pkg-kde-tools (>= 0.15.29~),
+# qml-module-qtgraphicaleffects (>= 5.15.2~),
+# qml-module-qtquick-layouts (>= 5.15.2+dfsg~),
+# qml-module-qtquick-window2 (>= 5.15.2+dfsg~),
+# qml-module-qttest (>= 5.15.2+dfsg~),
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev-tools (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# =====
+# qtsvg
+# =====
+               dbus,
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.17.14),
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# pkg-kde-tools (>= 0.15.17),
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# zlib1g-dev,
+# =======
+# qttools
+# =======
+# debhelper-compat (= 13),
+               libclang-dev (>= 1:3.9~) [amd64 arm64 armel armhf hurd-i386 i386 mips mips64 mips64el mips64r6 mips64r6el mipsel mipsr6 mipsr6el powerpc ppc64 ppc64el riscv64 s390x sparc64],
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# libqt5sql5-sqlite (>= 5.15.2+dfsg~),
+# libqt5webkit5-dev (>= 5.212.0~alpha4-8~) [alpha amd64 arm64 armel armhf i386 mips64el mipsel ppc64 ppc64el riscv64 s390x sh4 x32],
+               llvm-dev (>= 1:3.9~) [amd64 arm64 armel armhf hurd-i386 i386 mips mips64 mips64el mips64r6 mips64r6el mipsel mipsr6 mipsr6el powerpc ppc64 ppc64el riscv64 s390x sparc64],
+# pkg-kde-tools,
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# zlib1g-dev,
+# =========
+# qtwayland
+# =========
+# dbus <!nocheck>,
+# debhelper-compat (= 13),
+# dpkg-dev (>= 1.17.14),
+               libegl1-mesa-dev,
+               libfontconfig1-dev,
+# libglib2.0-dev,
+# libinput-dev,
+# libmtdev-dev [linux-any],
+# libudev-dev [linux-any],
+               libwayland-dev (>= 1.8.0),
+               libwayland-egl1-mesa | libwayland-egl1,
+               libxcomposite-dev,
+# libxkbcommon-dev (>= 0.2.0),
+# libxrender-dev,
+# pkg-config,
+# pkg-kde-tools,
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-dev:native (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# ============
+# qtwebchannel
+# ============
+# debhelper-compat (= 13),
+# libqt5websockets5-dev (>= 5.15.2~),
+# pkg-kde-tools,
+# qml-module-qttest (>= 5.15.2+dfsg~),
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev (>= 5.15.2+dfsg~),
+# ===========
+# qtwebengine
+# ===========
+# binutils (>= 2.32-8~),
+               binutils,
+               bison,
+               chrpath,
+               closure-compiler,
+# debhelper-compat (= 13),
+               flex,
+               gperf,
+               khronos-api,
+# libasound2-dev [linux-any],
+               libavcodec-dev (>= 7:3.4.8~),
+               libavformat-dev (>= 7:3.4.8~),
+               libavutil-dev (>= 7:3.4.8~),
+               libcap-dev [linux-any],
+# libdbus-1-dev,
+# libegl1-mesa-dev,
+               libevent-dev,
+               libflac-dev,
+# libfontconfig1-dev,
+# libgl-dev (>= 1.3) [!armel !armhf],
+# libgl1-mesa-dri,
+# libgles-dev [armel armhf],
+# libglib2.0-dev,
+               libglu1-mesa-dev [!armel !armhf] | libglu-dev [!armel !armhf],
+# libgstreamer-plugins-base1.0-dev,
+# libgstreamer1.0-dev,
+# libharfbuzz-dev,
+# libicu-dev (>= 64~),
+# libjpeg-dev,
+               libjsoncpp-dev,
+               liblcms2-dev,
+               libminizip-dev,
+               libnss3-dev,
+# libopus-dev (>= 1.3.1),
+               libopus-dev,
+               libpci-dev,
+# libpng-dev,
+               libprotobuf-dev,
+# libpulse-dev,
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# libqt5svg5-dev (>= 5.15.2~),
+# libqt5webchannel5-dev (>= 5.15.2~),
+               libre2-dev,
+               libsnappy-dev,
+# libsqlite3-dev,
+               libusb-1.0-0-dev,
+# libvpx-dev (>= 1.8),
+               libvpx-dev,
+               libwebp-dev,
+# libx11-xcb-dev,
+               libxcb-dri3-dev,
+# libxcomposite-dev,
+               libxcursor-dev,
+               libxdamage-dev,
+               libxml2-dev,
+               libxnvctrl-dev,
+               libxrandr-dev,
+# libxrender-dev,
+               libxslt1-dev,
+               libxss-dev,
+               libxtst-dev,
+               mesa-common-dev,
+               ninja-build,
+               nodejs (>= 10.19),
+# pkg-config,
+# pkg-kde-tools,
+               protobuf-compiler,
+               python2 | python,
+# qtbase5-dev (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# qtpositioning5-dev (>= 5.15.2+dfsg~),
+# qtquickcontrols2-5-dev (>= 5.15.2+dfsg~),
+# qttools5-dev (>= 5.15.2~),
+               re2c,
+               ruby,
+# xauth,
+# xvfb,
+               yasm [amd64 i386],
+               yui-compressor,
+# =======================================
+# qtwebkit (currently mainly for qttools)
+# =======================================
+# bison,
+               cmake (>= 2.8.12),
+# debhelper-compat (= 13),
+# flex,
+# gperf,
+# libfontconfig1-dev,
+               libgl1-mesa-dev [!armel !armhf] | libgl-dev [!armel !armhf],
+               libgles2-mesa-dev [armel armhf] | libgles2-dev [armel armhf],
+# libglib2.0-dev,
+# libglu1-mesa-dev [!armel !armhf] | libglu-dev [!armel !armhf],
+# libgstreamer-plugins-base1.0-dev,
+# libgstreamer1.0-dev,
+               libhyphen-dev,
+# libicu-dev,
+# libjpeg-dev,
+# libpng-dev,
+# libqt5opengl5-dev (>= 5.15.2+dfsg~),
+# libqt5sensors5-dev (>= 5.15.2~),
+# libqt5webchannel5-dev (>= 5.15.2~),
+# libsqlite3-dev,
+# libwebp-dev,
+               libwoff-dev,
+               libclang-dev,
+               gperf,
+               x11-utils,
+# libxcomposite-dev,
+# libxml2-dev,
+# libxrender-dev,
+# libxslt1-dev,
+# ninja-build,
+# pkg-config,
+# pkg-kde-tools (>= 0.6.4),
+# python3:native,
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# qtpositioning5-dev (>= 5.15.2+dfsg~),
+# ruby:native,
+# xauth <!nocheck>,
+# xvfb <!nocheck>,
+# ===============================
+# qtwebsockets (for qtwebchannel)
+# ===============================
+# debhelper-compat (= 13),
+# pkg-kde-tools,
+# qml-module-qtquick2 (>= 5.15.2+dfsg~),
+# qml-module-qttest (>= 5.15.2+dfsg~),
+# qtbase5-private-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-dev (>= 5.15.2+dfsg~),
+# qtdeclarative5-private-dev (>= 5.15.2+dfsg~),
+# xauth,
+# xvfb,
+
+
+Package: libqt-jami
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Custom build of Qt framework used by the Jami Qt client.
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami-env.sh b/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami-env.sh
new file mode 100755
index 000000000..6324f0fed
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami-env.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+QT_JAMI_PREFIX=/usr/lib/libqt-jami
+
+export PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
+export LD_LIBRARY_PATH="${QT_JAMI_PREFIX}/lib:${LD_LIBRARY_PATH}"
+export PKG_CONFIG_PATH="${QT_JAMI_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+export CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami.install b/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami.install
new file mode 100644
index 000000000..39543c60b
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/libqt-jami.install
@@ -0,0 +1,2 @@
+usr/lib/libqt-jami
+debian/libqt-jami-env.sh usr/lib/libqt-jami/bin/
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch b/extras/packaging/gnu-linux/rules/debian-qt/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
new file mode 100644
index 000000000..90a0bfaec
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
@@ -0,0 +1,59 @@
+Subject: [PATCH] Fix fatal error in getCurrentKeyboardLayout()
+
+FATAL:xkb_keyboard_layout_engine.cc(640)] Keymap file failed to load: dk(polytonic)
+
+Remove unnecessary tokenization of XKB layout.
+Parsing of layout configuration is already handled by
+XkbKeyboardLayoutEngine::ParseLayoutName().
+
+Fixes: QTBUG-101201
+Task-number: QTBUG-92971
+Pick-to: 6.2 6.3
+Change-Id: Ia4f09ed99eb82064a3b12e14eda69a6e0e12b0dd
+Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
+Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
+---
+ .../src/core/ozone/ozone_platform_qt.cpp      | 24 ++++---------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+diff --git a/qtwebengine/src/core/ozone/ozone_platform_qt.cpp b/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
+index 33d7bd992b..543e4bd371 100644
+--- a/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
++++ b/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
+@@ -184,29 +184,15 @@ static std::string getCurrentKeyboardLayout()
+     if (XkbRF_GetNamesProp(dpy, nullptr, &vdr) == 0)
+         return std::string();
+
+-    char *layout = strtok(vdr.layout, ",");
+-    for (int i = 0; i < state.group; i++) {
+-        layout = strtok(nullptr, ",");
+-        if (layout == nullptr)
+-            return std::string();
+-    }
++    if (!vdr.layout)
++        return std::string();
+
+     if (!vdr.variant)
+-        return layout;
+-
+-    char *variant = strtok(vdr.variant, ",");
+-    if (!variant)
+-        return layout;
+-
+-    for (int i = 0; i < state.group; i++) {
+-        variant = strtok(nullptr, ",");
+-        if (variant == nullptr)
+-            return layout;
+-    }
++        return std::string(vdr.layout);
+
+-    std::string layoutWithVariant = layout;
++    std::string layoutWithVariant = vdr.layout;
+     layoutWithVariant = layoutWithVariant.append("-");
+-    layoutWithVariant = layoutWithVariant.append(variant);
++    layoutWithVariant = layoutWithVariant.append(vdr.variant);
+     return layoutWithVariant;
+ }
+ #endif // BUILDFLAG(USE_XKBCOMMON)
+--
+2.35.3
\ No newline at end of file
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/patches/series b/extras/packaging/gnu-linux/rules/debian-qt/patches/series
new file mode 100644
index 000000000..5cd7cfb4a
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/patches/series
@@ -0,0 +1 @@
+0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/rules b/extras/packaging/gnu-linux/rules/debian-qt/rules
new file mode 100755
index 000000000..4c37d26f5
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/rules
@@ -0,0 +1,33 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# export DH_VERBOSE = 1
+
+%:
+	dh $@
+
+override_dh_auto_configure:
+	# Qt 6.2 build for gcc 8
+	sed -i 's,->GetProperty({,->GetProperty(GetPropertyRequest{,g' qtwebengine/src/3rdparty/chromium/ui/gfx/x/property_cache.cc
+	sed -i 's/max(),/max()/g' qtwebengine/src/3rdparty/chromium/ui/gfx/x/property_cache.cc
+	sed -i 's,PresentPixmap({,PresentPixmap(x11::Present::PresentPixmapRequest{,g' qtwebengine/src/3rdparty/chromium/components/viz/service/display_embedder/output_presenter_x11.cc
+	sed -i 's/last_target_msc_,/last_target_msc_/g' qtwebengine/src/3rdparty/chromium/components/viz/service/display_embedder/output_presenter_x11.cc
+	# Avoid MakeFlatSet
+	sed -i 's,const auto& GetNeverSniffedMimeTypes,/*const auto& GetNeverSniffedMimeTypes{,g' qtwebengine/src/3rdparty/chromium/services/network/public/cpp/cross_origin_read_blocking.cc
+	sed -i '1,/\/\/ static/{s/\/\/ static/*\/\}\/\/ static/;}' qtwebengine/src/3rdparty/chromium/services/network/public/cpp/cross_origin_read_blocking.cc
+	cp qtwebengine/src/3rdparty/chromium/services/network/public/cpp/cross_origin_read_blocking.cc temp
+	tac temp | sed '1,/return MimeType::kOthers/{s/return MimeType::kOthers/*\/return MimeType::kOthers/;}' | tac > qtwebengine/src/3rdparty/chromium/services/network/public/cpp/cross_origin_read_blocking.cc
+	rm temp -f
+	sed -i 's,if (base::Contains,/*if (base::Contains,g' qtwebengine/src/3rdparty/chromium/services/network/public/cpp/cross_origin_read_blocking.cc
+	CXXFLAGS="-flto -flto-partition=none" CFLAGS="-flto -flto-partition=none" ./configure \
+	  -opensource \
+	  -confirm-license \
+	  -nomake examples \
+	  -nomake tests \
+	  -prefix "${QT_JAMI_PREFIX}"
+
+override_dh_auto_build:
+	cmake --build . --parallel
+
+override_dh_auto_install:
+	cmake --install . --prefix $(CURDIR)/debian/tmp/${QT_JAMI_PREFIX}
diff --git a/extras/packaging/gnu-linux/rules/debian-qt/source/format b/extras/packaging/gnu-linux/rules/debian-qt/source/format
new file mode 100644
index 000000000..163aaf8d8
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian-qt/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/extras/packaging/gnu-linux/rules/debian/README.Debian b/extras/packaging/gnu-linux/rules/debian/README.Debian
new file mode 100644
index 000000000..cab237084
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/README.Debian
@@ -0,0 +1,35 @@
+# Differences and compatibility with official debian.org package
+
+This source package also provides binary package jami-all. jami-all is an
+all-in-one package that is it ships both the Jami Daemon and the GNOME
+client. This package is not available in the debian.org repositories (not
+needed in the Debian case).
+
+jami-all allows easy installation of Jami as a single package from jami.net.
+The reason is that one cannot register a repository in source.list.d and
+directly use it to fetch the dependencies. As a consequence it is not
+possible to have a one-click installation with two binary packages. That's
+why we build jami-all.
+
+jami-all conflicts with jami and jami-daemon since they are distributing the
+same files.
+
+# Notes
+
+## Importing a new version
+
+1- Prepare the new changelog entry mentioning the new version.
+   (the version on the changelog will be used to determine what to download).
+   Releases are available here: https://dl.jami.net/release/tarballs/
+
+2- Run debian/rules get-orig-source
+
+3- Import the tarball with gbp import-orig <tarball>
+
+## tarballs-unpacked
+
+We need those tarballs in tarballs-unpacked.
+The rest should be excluded.
+ - msgpack-c-cpp-1.2.0.tar.gz
+ - opendht-281b62dfd529a226e94d0da19e01acf07871a797.tar.gz
+ - pjproject-2.4.5.tar.bz2
diff --git a/extras/packaging/gnu-linux/rules/debian/compat b/extras/packaging/gnu-linux/rules/debian/compat
new file mode 100644
index 000000000..ec635144f
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/extras/packaging/gnu-linux/rules/debian/control b/extras/packaging/gnu-linux/rules/debian/control
new file mode 100644
index 000000000..38ecdaac4
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/control
@@ -0,0 +1,119 @@
+Source: jami
+Section: comm
+Priority: optional
+Maintainer: The Jami project <jami@gnu.org>
+Build-Depends: debhelper (>= 9),
+               autoconf,
+               automake,
+               libtool,
+               autotools-dev,
+# qt client
+               libqt-jami,
+               python3,
+               libnm-dev,
+               libnotify-dev,
+               libqrencode-dev,
+               libayatana-appindicator3-dev | libappindicator3-dev,
+# daemon
+               libdbus-1-dev,
+               libdbus-c++-dev,
+               libupnp-dev,
+               libgnutls28-dev,
+               libpulse-dev,
+               libasound2-dev,
+               libexpat1-dev,
+               libpcre3-dev,
+               libyaml-cpp-dev,
+               libboost-dev,
+               libxext-dev,
+               libxfixes-dev,
+               libspeex-dev,
+               libspeexdsp-dev,
+               uuid-dev,
+               libavcodec-dev,
+               libavutil-dev,
+               libavformat-dev,
+               libswscale-dev,
+               libavdevice-dev,
+               libopus-dev,
+               libudev-dev,
+               libgsm1-dev,
+               libjsoncpp-dev,
+               libnatpmp-dev,
+               libva-dev,
+               libcrypto++-dev,
+               libvdpau-dev,
+               libssl-dev,
+               libargon2-dev | libargon2-0-dev,
+# other
+               nasm,
+               yasm,
+Standards-Version: 4.1.5
+Homepage: https://jami.net
+Vcs-Git: https://git.jami.net/savoirfairelinux/jami-client-qt.git
+Vcs-Browser: https://git.jami.net/savoirfairelinux/jami-client-qt
+
+# The jami-all package is used as the "one-click install" package
+# offered on the Jami website.  The following relationships ensure
+# that installing the jami-all package replaces version of the other
+# individual Jami packages.  This is so that users can fix any
+# installation problem on their side by simply reinstalling as per the
+# website instructions.
+#
+Package: jami-all
+Architecture: any
+Depends: gnupg,
+         ${shlibs:Depends},
+         ${misc:Depends}
+Replaces: jami,
+          jami-libclient,
+          jami-daemon,
+          libqt-jami (>= 6.2.3),
+Conflicts: jami,
+           jami-libclient,
+           jami-libclient-gnome,
+           jami-daemon,
+           jami-gnome,
+           libqt-jami
+Description: One-click install package for Jami
+ This package only exists to provide an easy installation user experience.
+ To install the default client, install the 'jami' package.
+
+Package: jami
+Architecture: any
+Depends: ${shlibs:Depends},
+         ${misc:Depends},
+         jami-daemon (=${binary:Version}),
+         libqt-jami (>= 6.2.3)
+Provides: jami-qt
+Replaces: jami-all,
+          jami-libclient (<= 20220516.0214.9b42ad3~dfsg1-1)
+Breaks: jami-libclient (<= 20220516.0214.9b42ad3~dfsg1-1)
+Conflicts: jami-all
+Description: Secure and distributed voice, video and chat platform - desktop client
+ Jami (jami.net) is a secure and distributed voice, video and chat communication
+ platform that requires no centralized server and leaves the power of privacy
+ in the hands of the user.
+ .
+ This package contains the jami-qt desktop client.
+
+# Made into a transitional package on 2022-06-21, after libjamiclient
+# was merged into src/libclient under jami-client-qt.git, to provide
+# an upgrade path to existing users.  Feel free to remove this package
+# later into the future, some time after 2023-06-21 perhaps.
+Package: jami-libclient
+Architecture: any
+Description: transitional package for jami
+ This is a transitional package. Jami libclient has been merged into
+ the jami-qt client code-base, and this package can be safely removed.
+
+Package: jami-daemon
+Architecture: any
+Depends: ${shlibs:Depends},
+         ${misc:Depends}
+Description: Secure and distributed voice, video and chat platform - daemon
+ Jami (jami.net) is a secure and distributed voice, video and chat communication
+ platform that requires no centralized server and leaves the power of privacy
+ in the hands of the user.
+ .
+ This package contains the Jami daemon: jamid.
diff --git a/extras/packaging/gnu-linux/rules/debian/copyright b/extras/packaging/gnu-linux/rules/debian/copyright
new file mode 100644
index 000000000..1b2220deb
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/copyright
@@ -0,0 +1,212 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: jami
+Upstream-Contact: Alexandre Viau <alexandre.viau@savoirfairelinux.net>
+Source: https://dl.jami.net/release/tarballs/
+Files: *
+Copyright: 2004-2021 Savoir-faire Linux Inc.
+License: GPL-3+
+Comment: Upstream embeds everything that is needed to build Jami inside the release tarball.
+ Everything that is already in Debian has been removed.
+ .
+ OpenDHT was kept and not packaged independently. OpenDHT was written for Jami and is a moving
+ target. It is best to wait until it is more mature before packaging it separately.
+ .
+ Msgpack was kept because the version available in Debian is currently too old for Jami to build.
+ The Debian version of Msgpack cannot be updated at the moment because of reverse dependencies which
+ are not ready.
+ .
+ Pjproject was kept because it is heavily patched by Jami developers. None of the patches were merged
+ upstream and Jami developers are still waiting for a reaction from Pjproject developers.
+ See the relevant threads:
+  - http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2014-October/017905.html
+  - http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2015-January/018072.html
+  - http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2016-April/019196.html
+
+#####################
+## Start of daemon ##
+#####################
+
+Files: daemon/doc/dbus-api/tools/devhelp.xsl
+       daemon/doc/dbus-api/tools/doc-generator.py
+       daemon/doc/dbus-api/tools/doc-generator.xsl
+       daemon/doc/dbus-api/tools/specparser.py
+Copyright: 2009 Collabora Ltd.
+License: LGPL-2.1+
+
+Files: daemon/src/dlfcn.h
+       daemon/src/dlfcn.c
+Copyright: 2007 Ramiro Polla
+License: LGPL-2.1+
+
+Files: daemon/src/media/srtp.h
+       daemon/src/media/srtp.c
+Copyright: 2012 Martin Storsjo
+License: LGPL-2.1+
+
+Files: daemon/src/media/audio/opensl/audio_common.h
+       daemon/src/media/audio/opensl/audio_player.cpp
+       daemon/src/media/audio/opensl/audio_player.h
+       daemon/src/media/audio/opensl/audio_recorder.cpp
+       daemon/src/media/audio/opensl/audio_recorder.h
+       daemon/src/media/audio/opensl/buf_manager.h
+Copyright: 2015 The Android Open Source Project
+           2015-2019 Savoir-faire Linux Inc.
+License: Apache-2.0
+
+Files: daemon/extras/tools/bootstrap
+Copyright: 2011 Rafaël Carré
+License: GPL-2+
+
+Files: daemon/extras/tools/tools.mak
+       daemon/contrib/src/main.mak
+Copyright: 2003-2011 the VideoLAN team
+License: GPL-2+
+
+Files: daemon/m4/ax_cxx_compile_stdcxx.m4
+       daemon/m4/dolt.m4
+Copyright: 2008 Benjamin Kosnik <bkoz@redhat.com>
+           2012 Zack Weinberg <zackw@panix.com>
+           2013 Roy Stogner <roystgnr@ices.utexas.edu>
+           2014-2015 Google Inc.
+           2015 Paul Norman <penorman@mac.com>
+           2015 Moritz Klammler <moritz@klammler.eu>
+           2007-2010 Josh Triplett <josh@joshtriplett.org>
+License: GNUAllPermissive
+
+Files: daemon/tools/jamidctrl/sippwrap.py
+       daemon/tools/jamidctrl/test_jamid_dbus_interface.py
+Copyright: 2012 Free Software Foundation, Inc.
+License: GPL-2+
+
+Files: daemon/tools/cpplint.py3
+Copyright: 2009 Google Inc.
+License: BSD-3-Clause
+
+###################
+## End of daemon ##
+###################
+
+##################
+## Start of lrc ##
+##################
+
+Files: lrc/*
+Copyright: 2009-2019 by Savoir-faire Linux
+License: LGPL-2.1+
+
+################
+## End of lrc ##
+################
+
+
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ ․
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ ․
+ The complete text of the GNU General Public License version 3
+ can be found in `/usr/share/common-licenses/GPL-3`.
+
+License: GPL-2+
+ This package is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+ .
+ This package is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ details.
+ .
+ You should have received a copy of the GNU General Public License along with
+ this program. If not, see http://www.gnu.org/licenses/
+ .
+ On Debian systems, the complete text of the GNU General Public License version
+ 2 can be found in "/usr/share/common-licenses/GPL-2".
+
+License: Expat
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+ .
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+License: LGPL-2.1+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+ .
+ See /usr/share/common-licenses/LGPL-2.1 for the full license text.
+
+License: BSD-3-Clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+     * Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above copyright notice,
+       this list of conditions and the following disclaimer in the documentation
+       and/or other materials provided with the distribution.
+     * Neither the name of the copyright holder nor the names of its
+       contributors may be used to endorse or promote products derived from
+       this software without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ .
+ http://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ .
+ The complete text of the Apache version 2.0 license
+ can be found in "/usr/share/common-licenses/Apache-2.0".
+
+License: GNUAllPermissive
+ Copying and distribution of this file, with or without modification, are
+ permitted in any medium without royalty provided the copyright notice
+ and this notice are preserved. This file is offered as-is, without any
+ warranty.
+
+License: LGPL-2+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+ .
+ See /usr/share/common-licenses/LGPL-2 for the full license text.
diff --git a/extras/packaging/gnu-linux/rules/debian/jami-all.lintian-overrides b/extras/packaging/gnu-linux/rules/debian/jami-all.lintian-overrides
new file mode 100644
index 000000000..8ab14fe9b
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami-all.lintian-overrides
@@ -0,0 +1,3 @@
+# We are shipping a .so, but this isn't a library package
+package-name-doesnt-match-sonames
+no-symbols-control-file
diff --git a/extras/packaging/gnu-linux/rules/debian/jami-all.manpages b/extras/packaging/gnu-linux/rules/debian/jami-all.manpages
new file mode 100644
index 000000000..857be47ff
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami-all.manpages
@@ -0,0 +1 @@
+daemon/jamid.1
diff --git a/extras/packaging/gnu-linux/rules/debian/jami-all.postinst b/extras/packaging/gnu-linux/rules/debian/jami-all.postinst
new file mode 100755
index 000000000..93e1ebece
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami-all.postinst
@@ -0,0 +1,168 @@
+#!/bin/sh
+set -e
+
+###############################################################################
+# JAMI PACKAGE POSTINST                                                       #
+#                                                                             #
+# Install Jami's package repository to the trusted sources and add Jami's     #
+# release key to trusted keyring.                                             #
+#                                                                             #
+# NOTE: We follow https://wiki.debian.org/DebianRepository/UseThirdParty      #
+###############################################################################
+
+
+###############################################################################
+# [1] Configuration                                                           #
+###############################################################################
+
+# All package repo urls are expected to start with this string, regardless
+# of the distribution or version. The end tag is automatically appended,
+# depending on the system the postinst script is run on. Examples:
+#
+# Ubuntu 18.04:
+# $JAMI_REPO = $JAMI_REPO_BASE/ubuntu_18.04/
+#
+# Debian 10:
+# $JAMI_REPO = $JAMI_REPO_BASE/debian_10
+#
+# To update the appended end tags, modify the switch in [2].
+JAMI_REPO_BASE="https://dl.jami.net/nightly"
+
+# Jami release key.
+JAMI_KEY_FINGERPRINT="A295D773307D25A33AE72F2F64CD5FA175348F84"
+JAMI_KEY="\
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+mQENBFVSdlcBCAC9zC1rp12O2K08PGozI14Y+t4qC931eHicvkuEMF1B9gAhjdRF
+aIJS+UXwgQzoamDIHenxz1Q3fXUjKCMXytjGymB/0LUKccSbtH0Rcsl8kZ2z57KN
+E+GLS7SvlP93ZOxco7eAEBWF/fvMrCsm10sNI6bW7UK0bgql9iIetd6Wrp9xXFVs
+gmoV8Av714OlswsthSNtN+xQls3ozQ/dVGsOkZEyDbBzi88/rQEtuIDztTSWyD0V
+x7WaY5+mVRwsJKzyPlgvsXpbP7A41IFykeOzPKh+vYz3k7dcLIRdOwse79oT2RXt
+2VYEyTyTZIQlCJjGNTJYsU7GVffU4LnI7p/bABEBAAG0QFJpbmcgLSBTYXZvaXIt
+RmFpcmUgTGludXgsIEluYyA8cmluZ0BsaXN0cy5zYXZvaXJmYWlyZWxpbnV4Lm5l
+dD6JATkEEwEIACMFAlVSdlcCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAK
+CRBkzV+hdTSPhMqSB/9aaKXVByoE7zwPM8DDSntS/jYhhaV1CcZ78WeC1LY2UnHL
+R/yvABnDMikgqbMHBDu1R9dnjgZNntp7p0blxcT6ScxdZ6FpMZG6ZW5YNZIVctnF
+jdExStcdpcbbycW8GeCmQdVcKLBl8G55mick02ayVNOH5ETtWahPwBvMWk5hSaH3
+E18yvnmdqa9nCEST4UKvBOpmn58mwJDIR2YLdEFcL8z4FkxQUNkx/hiHSn+YLorZ
+H3iBrf9y9vSYhQ5pxx7seWkoaGAQBgfktRCUKvVY6E1oSZ/WR1WsR1ftDO/RD0E8
+APKzibVynUEQrCcQX16uDOa/YgavVkts9HmR7Vf7iQEcBBABCAAGBQJVUoJZAAoJ
+EFZ3uE+o8K8j0RkH/2sv4L3X0hPIwAzf3CUJZQuHihUOPRAoru5RqW/5nWqsroa1
+WChJq79uDEecDAizTA1MvaTFmLxTjCkJso+5UHMSHi6LARvYXSOeBPFizEJT4qZZ
+CXti5zh9d5z1u6L986mrnArA39IZ2F+9wV2q0VIDnq1Tt6+cJ745zSeZmbM6jip4
+oEBsKbCkAhq78sqCc7DIilsGbd2tgrLsh3fitvamEJCTCYKdDMog3TP0+EekQTA2
+Qp4jG0Uf7Gg1YvDDcsawXyNDrMBXEFPVhBNnRisX+YQBRWgDE58+fpsQfeTkblL5
+UaLWhDGlyfAc1ebL3InzhUWJswjt0BN3GPoP55m5AQ0EVVJ2VwEIAMXhg0w1IM0C
+rGXMGayaJ3EWd9YXkqq0sAN7b75tD0cOimyPNafnzChG9//3tt82aPRm8fG5Lk5U
+fwCS2MSt2Ml8UZeujmEBnvU9hsJBWcGgzXhtBQwZqzmV2vQg8436nTFY5L24TFBc
+QNOUJNzSy/dqps0SxcYleE57o24KHlW6ICBaEhz0JoZHv5+7GtYz6XN2D7pkwTPY
+UIahyt4dY3geFrkuMzZdTS4qyFb8EE/Ypi/WgewO9ib53kt7FBrxmm0l+d9GR4jH
+CKGqaYjm8xzTsNa3m2C0Cf/C13bOaQVicgntfQ32IjjZdaDMlRLQluYNQ0ETA1FE
+9+EVvrQYZ+kAEQEAAYkBHwQYAQgACQUCVVJ2VwIbDAAKCRBkzV+hdTSPhMIaB/9D
+CrIZBDy7YOK3gdnNm57jemJRz6Cum7RTUiqCQ8ivSmEgv1KmMIqMpjmnKKP43iHO
+mR4i7XDml6RBGynPys6cQcAlBWSuhOv9PGpRCaGyjJ4vmQUsYhyD/+tCDZVdBuGg
+CxteSMbawxtMHESqX7dDlctc+njDjBcbcGj73sj36qoFIjorjymZlT5IdK39oXVM
+Hi1TssiWPOU0hQgn4BIreYnEZUA6xuFX10C7k2DVRFZrXF7lpNgPQ8eNZTnQBIuw
+HUFCGSHO3/kzxSlkE1PBUX3IZ8PSFijyopBnWUhlSXuyRjte8OR7Fl/Rlf0IaOD1
+4sRdAfS333T4Uifq4uOu
+=s2aQ
+-----END PGP PUBLIC KEY BLOCK-----"
+
+# System paths and generated variables
+APT_FILE="/etc/apt/sources.list.d/jami-main.list"
+UPDATE_MANAGER_PATH="/etc/update-manager/release-upgrades.d/"
+JAMI_UPDATE_MANAGER_ID="jami-main"
+
+JAMI_UPDATE_MANAGER_CFG="${JAMI_UPDATE_MANAGER_ID}.cfg"
+UPDATE_MANAGER_CFG_PATH="${UPDATE_MANAGER_PATH}/${JAMI_UPDATE_MANAGER_CFG}"
+
+
+###############################################################################
+# [2] Set package repo url depending on distribution and version              #
+###############################################################################
+
+CAN_ADD_DEB_SOURCE=true
+
+# Detect currently running system using /etc/os-release
+# Debian-based systems are supposed to provide /etc/os-release so if it's not
+# the case then we simply don't want to provide automatic updates
+if [ -f /etc/os-release ]; then
+    . /etc/os-release
+
+    # Set-up Jami repository end tag
+    if [ "${VERSION_CODENAME}" = "buster" ] || [ "${ID}_${VERSION_ID}" = "debian_10" ]; then
+        ENDTAG="debian_10"
+    elif [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
+        ENDTAG="debian_11"
+    elif [ "${ID}_${VERSION_ID}" = "trisquel_9.0" ]; then
+        ENDTAG="ubuntu_18.04"
+    elif [ "${UBUNTU_CODENAME}" = "bionic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_18.04" ]; then
+        ENDTAG="ubuntu_18.04"
+    elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
+        ENDTAG="ubuntu_20.04"
+    elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
+        ENDTAG="ubuntu_22.04"
+    elif [ "${UBUNTU_CODENAME}" = "kinetic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.10" ]; then
+        ENDTAG="ubuntu_22.10"
+    elif [ "${ID}" = "debian" ] && \
+             [ "$(command -v lsb_release)" ] && \
+             [ "$(lsb_release -rs)" = "testing" ]; then
+        ENDTAG="debian_testing"
+    elif [ "${ID}" = "debian" ] && \
+             [ "$(command -v apt-cache)" ] && \
+             [ "$(command -v grep)" ] && \
+             apt-cache policy | grep -q "a=unstable" -; then
+        ENDTAG="debian_unstable"
+    else
+        # Distribution is not supported. Don't provide automatic updates.
+        CAN_ADD_DEB_SOURCE=false
+    fi
+else
+    CAN_ADD_DEB_SOURCE=false
+fi
+
+
+###############################################################################
+# [3] Maintainer script main switch                                           #
+###############################################################################
+
+case "$1" in
+    configure)
+        if [ "`command -v apt-key`" = "" ]; then
+            # we can only add key if apt-key is present
+            CAN_ADD_DEB_SOURCE=false
+        fi
+
+        if [ "${CAN_ADD_DEB_SOURCE}" = "true" ]; then
+            JAMI_REPO="${JAMI_REPO_BASE}/${ENDTAG}"
+
+            # We first add the key to the trusted keyring.
+            apt-key add - > /dev/null 2>&1 << EOF
+$JAMI_KEY
+EOF
+
+            # Add an entry for the package repository to the trusted package
+            # sources (DEB822 format)
+            cat > $APT_FILE <<EOF
+deb ${JAMI_REPO} jami main
+EOF
+
+            # Additionally, if update manager is installed we inform it about
+            # the repository so it doesn't get scrapped after system updates
+            if [ -d /etc/update-manager ]
+            then
+                mkdir -p $UPDATE_MANAGER_PATH
+                cat > $UPDATE_MANAGER_CFG_PATH <<EOF
+# Added by Jami to prevent disabling of Jami repository sources on
+# distribution release upgrade.
+[ThirdPartyMirrors]
+jami/${JAMI_UPDATE_MANAGER_ID}=${JAMI_REPO}
+EOF
+            fi
+        fi
+        ;;
+esac
+
+# exit with a zero status as everything went well, important for maintscripts
+exit 0
diff --git a/extras/packaging/gnu-linux/rules/debian/jami-all.triggers b/extras/packaging/gnu-linux/rules/debian/jami-all.triggers
new file mode 100644
index 000000000..dd8660367
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami-all.triggers
@@ -0,0 +1 @@
+activate-noawait ldconfig
diff --git a/extras/packaging/gnu-linux/rules/debian/jami-daemon.manpages b/extras/packaging/gnu-linux/rules/debian/jami-daemon.manpages
new file mode 100644
index 000000000..857be47ff
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami-daemon.manpages
@@ -0,0 +1 @@
+daemon/jamid.1
diff --git a/extras/packaging/gnu-linux/rules/debian/jami.lintian-overrides b/extras/packaging/gnu-linux/rules/debian/jami.lintian-overrides
new file mode 100644
index 000000000..8ab14fe9b
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami.lintian-overrides
@@ -0,0 +1,3 @@
+# We are shipping a .so, but this isn't a library package
+package-name-doesnt-match-sonames
+no-symbols-control-file
diff --git a/extras/packaging/gnu-linux/rules/debian/jami.manpages b/extras/packaging/gnu-linux/rules/debian/jami.manpages
new file mode 100644
index 000000000..e69de29bb
diff --git a/extras/packaging/gnu-linux/rules/debian/jami.triggers b/extras/packaging/gnu-linux/rules/debian/jami.triggers
new file mode 100644
index 000000000..dd8660367
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/jami.triggers
@@ -0,0 +1 @@
+activate-noawait ldconfig
diff --git a/extras/packaging/gnu-linux/rules/debian/rules b/extras/packaging/gnu-linux/rules/debian/rules
new file mode 100755
index 000000000..1826aba1a
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/rules
@@ -0,0 +1,158 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Hardening
+export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+DPKG_EXPORT_BUILDFLAGS = 1
+include /usr/share/dpkg/buildflags.mk
+
+# Ubuntu defaults to use -Bsymbolic-functions, which breaks linking
+# shared objects with static FFmpeg archives (see:
+# https://bugs.launchpad.net/ubuntu/+source/ffmpeg/+bug/1942352).
+ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
+ifneq (,$(LDFLAGS))
+  LDFLAGS := $(filter-out %-Bsymbolic-functions,$(LDFLAGS))
+endif
+endif
+
+# Number of CPUS
+NO_CPUS=$(shell nproc)
+ifeq ($(NO_CPUS),0)
+NO_CPUS=1
+endif
+
+# Binary package names
+JAMI_ALL_IN_ONE_PKG_NAME="jami-all"
+JAMI_CLIENT_PKG_NAME="jami"
+JAMI_DAEMON_PKG_NAME="jami-daemon"
+
+# Bundled packages from contrib
+BUNDLED_PKGS=""
+ifeq (debian_10,$(findstring debian_10, $(DISTRIBUTION)))
+# Daemon's bundled libarchive does not build on Debian 10
+BUNDLED_PKGS="--disable-libarchive"
+endif
+ifeq (ubuntu_18.04,$(findstring ubuntu_18.04, $(DISTRIBUTION)))
+# Daemon's bundled libarchive does not build on Ubuntu 18.04
+BUNDLED_PKGS="--disable-libarchive"
+endif
+ifeq (raspbian_10_armhf,$(findstring raspbian_10_armhf, $(DISTRIBUTION)))
+# Raspbian's yaml-cpp lib does not work properly
+BUNDLED_PKGS="--enable-ffmpeg --enable-yaml-cpp"
+# Add host environment variables
+CMAKE_OPTIONS=-DCHOST=${HOST_ARCH} \
+  -DCMAKE_C_COMPILER=${HOST_ARCH}-gcc \
+  -DCMAKE_CXX_COMPILER=${HOST_ARCH}-g++ \
+  -DCMAKE_FIND_ROOT_PATH=/usr/${HOST_ARCH} \
+  -DCMAKE_BUILD_TYPE=Release \
+  -DPKG_CONFIG_EXECUTABLE=/usr/bin/${HOST_ARCH}-pkg-config
+endif
+
+# Qt-related variables
+QT_JAMI_PREFIX := ${QT_JAMI_PREFIX}
+export PATH := $(QT_JAMI_PREFIX)/bin:${PATH}
+export LD_LIBRARY_PATH := $(QT_JAMI_PREFIX)/lib:${LD_LIBRARY_PATH}
+export PKG_CONFIG_PATH := $(QT_JAMI_PREFIX)/lib/pkgconfig:${PKG_CONFIG_PATH}
+export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX)/lib/cmake:${CMAKE_PREFIX_PATH}
+export CFLAGS := $(CFLAGS) -fno-lto
+export CXXFLAGS := $(CXXFLAGS) -fno-lto
+
+# Installation directories.
+OCI_INSTALL_DIR = $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)
+
+%:
+	dh $@
+
+override_dh_auto_configure:
+
+override_dh_auto_build:
+	# Daemon contribs build + configure
+	mkdir -p daemon/contrib/native
+ifeq (ubuntu_18.04,$(findstring ubuntu_18.04, $(DISTRIBUTION)))
+	sed -i 's/GNUTLS_CONF :=/& --without-zstd/' daemon/contrib/src/gnutls/rules.mak
+endif
+	cd daemon/contrib/native && \
+	../bootstrap \
+	  --host=${HOST_ARCH} \
+	  --disable-downloads \
+	  --no-checksums \
+	  --disable-ogg \
+	  --disable-flac \
+	  --disable-vorbis \
+	  --disable-vorbisenc \
+	  --disable-speex \
+	  --disable-sndfile \
+	  --disable-gsm \
+	  --disable-speexdsp \
+	  --disable-natpmp  \
+	  --enable-gnutls $(BUNDLED_PKGS) && \
+	make list && \
+	make -j$(NO_CPUS) V=1
+	cd daemon && \
+	./autogen.sh && \
+	./configure \
+	  --prefix=/usr \
+	  --host=${HOST_ARCH}
+
+	# Daemon build
+	make -C daemon -j$(NO_CPUS) V=1
+	pod2man daemon/man/jamid.pod > daemon/jamid.1
+
+	# Qt client configure and build
+	mkdir build && \
+	cd build && \
+	cmake \
+	  -DCMAKE_INSTALL_PREFIX=/usr \
+	  -DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
+	  -DENABLE_LIBWRAP=true \
+	  $(CMAKE_OPTIONS) ..
+	make -C build -j$(NO_CPUS) V=1
+
+override_dh_auto_clean:
+	# Daemon clean
+	[ -f daemon/contrib/native/Makefile ] && \
+	  make -C daemon/contrib/native distclean || true
+	rm -rfv daemon/contrib/native
+	rm -rfv daemon/jamid.1
+
+	# Qt client clean
+	# CMake build system has no distclean target, so use clean.
+	[ -f build/Makefile ] && make -C build clean || true
+	rm -rfv build
+
+override_dh_auto_install:
+	# Daemon install
+	cd daemon && make DESTDIR=$(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME) install
+	rm -rfv $(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME)/usr/include
+	rm -rfv $(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME)/usr/lib/*.a
+	rm -rfv $(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME)/usr/lib/*.la
+
+	# Qt client install
+	cd build && \
+	make DESTDIR=$(CURDIR)/debian/$(JAMI_CLIENT_PKG_NAME) install
+
+	## Custom Qt package for Jami (libqt-jami)
+	## Copy our own Qt library package content into the OCI package.
+	for file_name in $$(dpkg-query -L libqt-jami); do 	\
+	  mkdir -p "$(OCI_INSTALL_DIR)$$(dirname $$file_name)"; \
+	  test -d "$$file_name" && continue;  			\
+	  cp "$$file_name" "$(OCI_INSTALL_DIR)$$file_name";	\
+	done
+
+	# Jami all-in-one install
+	#   Daemon
+	cd daemon && make DESTDIR=$(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME) install
+	rm -rfv $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)/usr/include
+	rm -rfv $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)/usr/lib/*.a
+	rm -rfv $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)/usr/lib/*.la
+	#   Qt client
+	cd build && \
+	make DESTDIR=$(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME) install
+
+override_dh_shlibdeps:
+	dh_shlibdeps -- -x$(JAMI_ALL_IN_ONE_PKG_NAME)
+
+tmpdir:= $(shell mktemp -d)
+workdir:= $(shell pwd)
+PKD := $(abspath $(dir $(MAKEFILE_LIST)))
+version_to_download := $(shell dpkg-parsechangelog -ldebian/changelog | perl -ne 'print $$1 if m{^Version:\s+(?:\d+:)?(\d.*)(?:\~dfsg.+)(?:\-\d+.*)};')
diff --git a/extras/packaging/gnu-linux/rules/debian/source/format b/extras/packaging/gnu-linux/rules/debian/source/format
new file mode 100644
index 000000000..163aaf8d8
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/extras/packaging/gnu-linux/rules/debian/watch b/extras/packaging/gnu-linux/rules/debian/watch
new file mode 100644
index 000000000..c219a014f
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/debian/watch
@@ -0,0 +1,3 @@
+version=3
+opts=dversionmangle=s/\~dfsg\d*$// \
+https://dl.jami.net/release/tarballs/ jami_(\d\S*)\.tar\.gz
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami-all.postinst b/extras/packaging/gnu-linux/rules/rpm/jami-all.postinst
new file mode 100755
index 000000000..04df2e52f
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami-all.postinst
@@ -0,0 +1,133 @@
+#!/bin/sh -e
+
+
+###############################################################################
+# JAMI PACKAGE POSTINST                                                       #
+#                                                                             #
+# Install Jami's package repository to the trusted sources and add Jami's     #
+# release key to trusted keyring.                                             #
+#                                                                             #
+###############################################################################
+
+
+###############################################################################
+# [1] Configuration                                                           #
+###############################################################################
+
+JAMI_REPO_BASE="https://dl.jami.net/nightly"
+
+# Jami release key.
+JAMI_KEY_FINGERPRINT="A295D773307D25A33AE72F2F64CD5FA175348F84"
+JAMI_KEY="\
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+mQENBFVSdlcBCAC9zC1rp12O2K08PGozI14Y+t4qC931eHicvkuEMF1B9gAhjdRF
+aIJS+UXwgQzoamDIHenxz1Q3fXUjKCMXytjGymB/0LUKccSbtH0Rcsl8kZ2z57KN
+E+GLS7SvlP93ZOxco7eAEBWF/fvMrCsm10sNI6bW7UK0bgql9iIetd6Wrp9xXFVs
+gmoV8Av714OlswsthSNtN+xQls3ozQ/dVGsOkZEyDbBzi88/rQEtuIDztTSWyD0V
+x7WaY5+mVRwsJKzyPlgvsXpbP7A41IFykeOzPKh+vYz3k7dcLIRdOwse79oT2RXt
+2VYEyTyTZIQlCJjGNTJYsU7GVffU4LnI7p/bABEBAAG0QFJpbmcgLSBTYXZvaXIt
+RmFpcmUgTGludXgsIEluYyA8cmluZ0BsaXN0cy5zYXZvaXJmYWlyZWxpbnV4Lm5l
+dD6JATkEEwEIACMFAlVSdlcCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAK
+CRBkzV+hdTSPhMqSB/9aaKXVByoE7zwPM8DDSntS/jYhhaV1CcZ78WeC1LY2UnHL
+R/yvABnDMikgqbMHBDu1R9dnjgZNntp7p0blxcT6ScxdZ6FpMZG6ZW5YNZIVctnF
+jdExStcdpcbbycW8GeCmQdVcKLBl8G55mick02ayVNOH5ETtWahPwBvMWk5hSaH3
+E18yvnmdqa9nCEST4UKvBOpmn58mwJDIR2YLdEFcL8z4FkxQUNkx/hiHSn+YLorZ
+H3iBrf9y9vSYhQ5pxx7seWkoaGAQBgfktRCUKvVY6E1oSZ/WR1WsR1ftDO/RD0E8
+APKzibVynUEQrCcQX16uDOa/YgavVkts9HmR7Vf7iQEcBBABCAAGBQJVUoJZAAoJ
+EFZ3uE+o8K8j0RkH/2sv4L3X0hPIwAzf3CUJZQuHihUOPRAoru5RqW/5nWqsroa1
+WChJq79uDEecDAizTA1MvaTFmLxTjCkJso+5UHMSHi6LARvYXSOeBPFizEJT4qZZ
+CXti5zh9d5z1u6L986mrnArA39IZ2F+9wV2q0VIDnq1Tt6+cJ745zSeZmbM6jip4
+oEBsKbCkAhq78sqCc7DIilsGbd2tgrLsh3fitvamEJCTCYKdDMog3TP0+EekQTA2
+Qp4jG0Uf7Gg1YvDDcsawXyNDrMBXEFPVhBNnRisX+YQBRWgDE58+fpsQfeTkblL5
+UaLWhDGlyfAc1ebL3InzhUWJswjt0BN3GPoP55m5AQ0EVVJ2VwEIAMXhg0w1IM0C
+rGXMGayaJ3EWd9YXkqq0sAN7b75tD0cOimyPNafnzChG9//3tt82aPRm8fG5Lk5U
+fwCS2MSt2Ml8UZeujmEBnvU9hsJBWcGgzXhtBQwZqzmV2vQg8436nTFY5L24TFBc
+QNOUJNzSy/dqps0SxcYleE57o24KHlW6ICBaEhz0JoZHv5+7GtYz6XN2D7pkwTPY
+UIahyt4dY3geFrkuMzZdTS4qyFb8EE/Ypi/WgewO9ib53kt7FBrxmm0l+d9GR4jH
+CKGqaYjm8xzTsNa3m2C0Cf/C13bOaQVicgntfQ32IjjZdaDMlRLQluYNQ0ETA1FE
+9+EVvrQYZ+kAEQEAAYkBHwQYAQgACQUCVVJ2VwIbDAAKCRBkzV+hdTSPhMIaB/9D
+CrIZBDy7YOK3gdnNm57jemJRz6Cum7RTUiqCQ8ivSmEgv1KmMIqMpjmnKKP43iHO
+mR4i7XDml6RBGynPys6cQcAlBWSuhOv9PGpRCaGyjJ4vmQUsYhyD/+tCDZVdBuGg
+CxteSMbawxtMHESqX7dDlctc+njDjBcbcGj73sj36qoFIjorjymZlT5IdK39oXVM
+Hi1TssiWPOU0hQgn4BIreYnEZUA6xuFX10C7k2DVRFZrXF7lpNgPQ8eNZTnQBIuw
+HUFCGSHO3/kzxSlkE1PBUX3IZ8PSFijyopBnWUhlSXuyRjte8OR7Fl/Rlf0IaOD1
+4sRdAfS333T4Uifq4uOu
+=s2aQ
+-----END PGP PUBLIC KEY BLOCK-----"
+
+# System paths and generated variables
+# In general: you will not need to modify these variables.
+# WARNING: When modifying the paths, keep in mind that the corresponding
+# postrm paths should be modified as well
+REPO_FILE="/etc/yum.repos.d/jami-main.repo"
+GPG_FILE="/etc/pki/rpm-gpg/RPM-GPG-KEY-JAMI"
+
+is_distribution_supported() {
+
+    # Detect currently running system using /etc/os-release
+    # Redhat-based systems are supposed to provide /etc/os-release so
+    # if it's not the case then we simply don't want to provide
+    # automatic updates.
+    if ! [ -f /etc/os-release ]; then
+        return 1
+    fi
+
+    # This defines variables such as NAME, ID, VERSION_ID, etc.
+    . /etc/os-release
+
+    case ${ID} in
+        rhel*|fedora*|opensuse*)
+            return 0
+    esac
+
+    return 1
+}
+
+has_rpm() {
+    command -v rpm > /dev/null
+}
+
+is_opensuse() {
+    case ${ID} in
+        opensuse*)
+            return 0
+    esac
+    return 1
+}
+
+###############################################################################
+# [3] Maintainer script main switch                                           #
+###############################################################################
+
+# Exit unless the following conditions are met.
+is_distribution_supported && has_rpm || exit 0
+
+# Note: the NAME and ID variables are set as a side-effect of sourcing
+# the /etc/os-release file in the above is_distribution_supported
+# call.
+
+# SUSE specifics.
+if is_opensuse; then
+    REPO_FILE=/etc/zypp/repos.d/jami-main.repo
+    GPG_FILE="/tmp/RPM-GPG-KEY-JAMI"
+fi
+
+# Add the key to the trusted keyring.
+echo "$JAMI_KEY" > "$GPG_FILE"
+rm -f /var/lib/rpm/.rpm.lock > /dev/null 2>&1
+rpm --import "$GPG_FILE"  > /dev/null 2>&1
+
+jami_repo_name="$DISTRIBUTION \$releasever - \$basearch - Jami"
+jami_repo_base_url="$JAMI_REPO_BASE/$ID_\$releasever"
+
+# Add an entry for the package repository to the trusted package.
+cat > "$REPO_FILE" <<EOF
+[jami]
+name=$jami_repo_name
+baseurl=$jami_repo_base_url
+gpgcheck=1
+gpgkey=https://dl.jami.net/jami.pub.key
+enabled=1
+EOF
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami-daemon.spec b/extras/packaging/gnu-linux/rules/rpm/jami-daemon.spec
new file mode 100644
index 000000000..7c268e288
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami-daemon.spec
@@ -0,0 +1,128 @@
+%define name        jami-daemon
+%define version     RELEASE_VERSION
+%define release     0
+
+Name:          %{name}
+Version:       %{version}
+Release:       %{release}%{?dist}
+Summary:       Daemon component of Jami
+Group:         Applications/Internet
+License:       GPLv3+
+Vendor:        Savoir-faire Linux
+URL:           https://jami.net/
+Source:        jami_%{version}.tar.gz
+Requires:      jami-daemon = %{version}
+
+# Build dependencies
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: gettext-devel
+BuildRequires: libtool
+BuildRequires: make
+BuildRequires: which
+BuildRequires: yasm
+
+# Build and runtime dependencies.  Requires directives are
+# automatically made to linked shared libraries via RPM, so there's no
+# need to explicitly relist them.
+%if 0%{?fedora} >= 32
+BuildRequires: NetworkManager-libnm-devel
+BuildRequires: cmake
+BuildRequires: gcc-c++
+BuildRequires: dbus-devel
+BuildRequires: expat-devel
+BuildRequires: opus-devel
+BuildRequires: pulseaudio-libs-devel
+%endif
+%if %{defined suse_version}
+BuildRequires: libdbus-c++-devel
+BuildRequires: libexpat-devel
+BuildRequires: libopus-devel
+BuildRequires: libpulse-devel
+%else
+BuildRequires: gnutls-devel
+%endif
+BuildRequires: alsa-lib-devel
+BuildRequires: jsoncpp-devel
+BuildRequires: libXext-devel
+BuildRequires: libXfixes-devel
+BuildRequires: libuuid-devel
+BuildRequires: libva-devel
+BuildRequires: libvdpau-devel
+BuildRequires: pcre-devel
+BuildRequires: uuid-devel
+BuildRequires: yaml-cpp-devel
+
+%description
+This package contains the daemon of Jami, a free software for
+universal communication which respects the freedoms and privacy of its
+users.
+
+%prep
+%setup -n client-qt
+
+%build
+CFLAGS="${CFLAGS} -fno-lto"
+CXXFLAGS="${CXXFLAGS} -fno-lto"
+# Configure the Jami bundled libraries (ffmpeg & pjproject).
+mkdir -p daemon/contrib/native
+cd %{_builddir}/client-qt/daemon/contrib/native && \
+    ../bootstrap \
+        --no-checksums \
+        --disable-ogg \
+        --disable-flac \
+        --disable-vorbis \
+        --disable-vorbisenc \
+        --disable-speex \
+        --disable-sndfile \
+        --disable-gsm \
+        --disable-speexdsp \
+        --disable-natpmp && \
+    make list && \
+    make fetch && \
+    make %{_smp_mflags} V=1 && \
+    make %{_smp_mflags} V=1 .ffmpeg
+# Configure the daemon.
+cd %{_builddir}/client-qt/daemon && \
+    ./autogen.sh && \
+    ./configure \
+        --prefix=%{_prefix} \
+        --libdir=%{_libdir}
+# Build the daemon.
+make -C %{_builddir}/client-qt/daemon %{_smp_mflags} V=1
+pod2man %{_builddir}/client-qt/daemon/man/jamid.pod \
+        > %{_builddir}/client-qt/daemon/jamid.1
+
+%install
+DESTDIR=%{buildroot} make -C daemon install
+cp %{_builddir}/client-qt/daemon/jamid.1 \
+   %{buildroot}/%{_mandir}/man1/jamid.1
+rm -rfv %{buildroot}/%{_libdir}/*.a
+rm -rfv %{buildroot}/%{_libdir}/*.la
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libjami.so*
+%{_libdir}/pkgconfig/jami.pc
+# XXX: Use %%{_libexecdir}/jamid after there's no more OpenSUSE Leap
+# < 16 (see https://en.opensuse.org/openSUSE:Specfile_guidelines).
+/usr/libexec/jamid
+%{_datadir}/jami/ringtones
+%{_datadir}/dbus-1/services/*
+%{_datadir}/dbus-1/interfaces/*
+%doc %{_mandir}/man1/jamid*
+
+%package devel
+Summary: Development files of the Jami daemon
+
+%description devel
+This package contains the header files for using the Jami daemon as a library.
+
+%files devel
+%{_includedir}/jami
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami-libclient.spec b/extras/packaging/gnu-linux/rules/rpm/jami-libclient.spec
new file mode 100644
index 000000000..003e31161
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami-libclient.spec
@@ -0,0 +1,25 @@
+# Made into a transitional package on 2022-06-21, after libjamiclient
+# was merged into src/libclient under jami-client-qt.git, to provide
+# an upgrade path to existing users.  Feel free to remove this package
+# later into the future, some time after 2023-06-21 perhaps.
+
+%define name        jami-libclient
+%define version     RELEASE_VERSION
+%define release     0
+
+Name:          %{name}
+Version:       %{version}
+Release:       %{release}%{?dist}
+Summary:       Transitional package for Jami; can be safely removed
+Group:         Applications/Internet
+License:       GPLv3+
+Vendor:        Savoir-faire Linux
+URL:           https://jami.net/
+Source:        jami_%{version}.tar.gz
+
+%description
+This is a transitional package. Jami libclient has been merged into
+the jami-qt client code-base, and this package can be safely removed.
+
+# Required, otherwise no rpm is generated.
+%files
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami-libqt.spec b/extras/packaging/gnu-linux/rules/rpm/jami-libqt.spec
new file mode 100644
index 000000000..5e2e3d1ea
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami-libqt.spec
@@ -0,0 +1,97 @@
+%define name        jami-libqt
+%define version     RELEASE_VERSION
+%define release     5
+
+# qtwebengine (aka chromium) takes a ton of memory per build process,
+# up to 2.3 GiB.  Cap the number of jobs based on the amount of
+# available memory to try to guard against OOM build failures.
+%define min(a,b) %(echo $(( %1 < %2 ? %1 : %2 )))
+%define max(a,b) %(echo $(( %1 > %2 ? %1 : %2 )))
+
+%define cpu_count %max %(nproc) 1
+%define available_memory %(free -g | grep -E '^Mem:' | awk '{print $7}')
+# Required memory in GiB.
+%define max_parallel_builds 4
+%define memory_required_per_core 2
+%define computed_job_count_ %(echo $(( %available_memory / %memory_required_per_core / %max_parallel_builds )))
+%define computed_job_count %max %computed_job_count_ 1
+%define job_count %min %cpu_count %computed_job_count
+
+Name:          %{name}
+Version:       %{version}
+Release:       %{release}%{?dist}
+Summary:       Library for Jami-qt
+Group:         Applications/Internet
+License:       GPLv3+
+Vendor:        Savoir-faire Linux
+URL:           https://jami.net/
+Source:        jami-qtlib_%{version}.tar.xz
+Patch0:        0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
+
+%global gst 0.10
+%if 0%{?fedora} || 0%{?rhel} > 7
+%global gst 1.0
+%endif
+
+# Build dependencies
+BuildRequires: autoconf
+BuildRequires: make
+# QtWebEngine
+BuildRequires: bison
+BuildRequires: gperf
+BuildRequires: flex
+BuildRequires: vulkan-devel
+%if %{defined suse_version}
+BuildRequires: ffmpeg-devel
+BuildRequires: ffmpeg
+BuildRequires: python-xml
+BuildRequires: mozilla-nss-devel
+%else
+BuildRequires: pkgconfig(gstreamer-%{gst})
+BuildRequires: pkgconfig(gstreamer-app-%{gst})
+BuildRequires: pkgconfig(gstreamer-audio-%{gst})
+BuildRequires: pkgconfig(gstreamer-base-%{gst})
+BuildRequires: pkgconfig(gstreamer-pbutils-%{gst})
+BuildRequires: pkgconfig(gstreamer-plugins-bad-%{gst})
+BuildRequires: pkgconfig(gstreamer-video-%{gst})
+%endif
+
+%description
+This package contains Qt libraries for Jami.
+
+%prep
+%setup -n qt-everywhere-src-%{version}
+%patch0 -p1
+
+%build
+echo "Building Qt using %{job_count} parallel jobs"
+# Qt 6.2 (https://wiki.linuxfromscratch.org/blfs/ticket/14729)
+sed -i 's,default=False,default=True,g' qtwebengine/src/3rdparty/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents.py
+# https://bugs.gentoo.org/768261 (Qt 5.15)
+sed -i 's,#include "absl/base/internal/spinlock.h"1,#include "absl/base/internal/spinlock.h"1\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc
+sed -i 's,#include <stdint.h>,#include <stdint.h>\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h
+# else, break build for fedora 35
+sed -i 's/static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);/static const size_t kSigStackSize = std::max(size_t(16384), size_t(SIGSTKSZ));/g' qtwebengine/src/3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
+# https://bugreports.qt.io/browse/QTBUG-93452 (Qt 5.15)
+sed -i 's,#  include <utility>,#  include <utility>\n#  include <limits>,g' qtbase/src/corelib/global/qglobal.h
+sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qendian.h
+cat qtbase/src/corelib/global/qendian.h
+sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
+sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
+# recent gcc version do not like lto from qt
+CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" ./configure \
+  -opensource \
+  -confirm-license \
+  -nomake examples \
+  -nomake tests \
+  -prefix "%{_libdir}/qt-jami"
+sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
+# Chromium is built using Ninja, which doesn't honor MAKEFLAGS.
+cmake --build . --parallel
+
+%install
+cmake --install . --prefix %{buildroot}/${QT_JAMI_PREFIX}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/qt-jami
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami-qt.spec b/extras/packaging/gnu-linux/rules/rpm/jami-qt.spec
new file mode 100644
index 000000000..5cc25e896
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami-qt.spec
@@ -0,0 +1,26 @@
+# Made into a transitional package on 2022-10-12, after the 'jami-qt'
+# to 'jami' rename, to provide an upgrade path to existing users.
+# Feel free to remove this package later into the future, some time
+# after 2023-10-12 perhaps.
+
+%define name        jami-qt
+%define version     RELEASE_VERSION
+%define release     0
+
+Name:          %{name}
+Version:       %{version}
+Release:       %{release}%{?dist}
+Summary:       Transitional package for Jami; can be safely removed
+Group:         Applications/Internet
+License:       GPLv3+
+Vendor:        Savoir-faire Linux
+URL:           https://jami.net/
+Source:        jami_%{version}.tar.gz
+Requires:      jami
+
+%description
+This is a transitional package. The Jami Qt client is now packaged
+under the name 'jami', and this package can be safely removed.
+
+# Required, otherwise no rpm is generated.
+%files
diff --git a/extras/packaging/gnu-linux/rules/rpm/jami.spec b/extras/packaging/gnu-linux/rules/rpm/jami.spec
new file mode 100644
index 000000000..14acb7ccc
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/jami.spec
@@ -0,0 +1,83 @@
+%define name        jami
+%define version     RELEASE_VERSION
+%define release     0
+
+Name:          %{name}
+Version:       %{version}
+Release:       %{release}%{?dist}
+Summary:       Qt client for Jami
+Group:         Applications/Internet
+License:       GPLv3+
+Vendor:        Savoir-faire Linux
+URL:           https://jami.net/
+Source:        jami_%{version}.tar.gz
+Requires:      jami-daemon = %{version}
+Requires:      jami-libqt
+Provides:      jami-qt = %{version}
+Obsoletes:     jami-qt < 20221010.1109.641d67d-2
+Obsoletes:     jami-libclient <= 20220516.0214.9b42ad3-1
+
+# Build dependencies.
+%if 0%{?fedora} >= 32
+BuildRequires: cmake
+BuildRequires: gcc-c++
+%endif
+BuildRequires: make
+
+# For generating resources.qrc in build time.
+BuildRequires: python3
+
+# Build and runtime dependencies.
+BuildRequires: qrencode-devel
+
+%description
+This package contains the Qt desktop client of Jami. Jami is a free
+software for universal communication which respects freedoms and
+privacy of its users.
+
+%prep
+%setup -n client-qt
+
+%build
+# Configure and build bundled ffmpeg (for libavutil/avframe).
+mkdir -p %{_builddir}/client-qt/daemon/contrib/native
+cd %{_builddir}/client-qt/daemon/contrib/native && \
+    ../bootstrap \
+        --no-checksums \
+        --disable-ogg \
+        --disable-flac \
+        --disable-vorbis \
+        --disable-vorbisenc \
+        --disable-speex \
+        --disable-sndfile \
+        --disable-gsm \
+        --disable-speexdsp \
+        --disable-natpmp && \
+    make list && \
+    make fetch && \
+    make %{_smp_mflags} V=1 .ffmpeg
+# Qt-related variables
+cd %{_builddir}/client-qt && \
+    mkdir build && cd build && \
+    cmake -DENABLE_LIBWRAP=true \
+          -DLIBJAMI_BUILD_DIR=%{_builddir}/client-qt/daemon/src \
+          -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+          -DCMAKE_INSTALL_LIBDIR=%{_libdir} \
+          -DWITH_DAEMON_SUBMODULE=true \
+          -DCMAKE_BUILD_TYPE=Release \
+          ..
+make -C %{_builddir}/client-qt/build %{_smp_mflags} V=1
+
+%install
+DESTDIR=%{buildroot} make -C %{_builddir}/client-qt/build install
+
+%files
+%defattr(-,root,root,-)
+%{_bindir}/jami
+%{_datadir}/applications/jami.desktop
+%{_datadir}/jami/jami.desktop
+%{_datadir}/icons/hicolor/scalable/apps/jami.svg
+%{_datadir}/icons/hicolor/48x48/apps/jami.png
+%{_datadir}/pixmaps/jami.xpm
+%{_datadir}/metainfo/jami.appdata.xml
+%{_datadir}/jami/translations/*
diff --git a/extras/packaging/gnu-linux/rules/rpm/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch b/extras/packaging/gnu-linux/rules/rpm/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
new file mode 100644
index 000000000..90a0bfaec
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/rpm/patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch
@@ -0,0 +1,59 @@
+Subject: [PATCH] Fix fatal error in getCurrentKeyboardLayout()
+
+FATAL:xkb_keyboard_layout_engine.cc(640)] Keymap file failed to load: dk(polytonic)
+
+Remove unnecessary tokenization of XKB layout.
+Parsing of layout configuration is already handled by
+XkbKeyboardLayoutEngine::ParseLayoutName().
+
+Fixes: QTBUG-101201
+Task-number: QTBUG-92971
+Pick-to: 6.2 6.3
+Change-Id: Ia4f09ed99eb82064a3b12e14eda69a6e0e12b0dd
+Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
+Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
+---
+ .../src/core/ozone/ozone_platform_qt.cpp      | 24 ++++---------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+diff --git a/qtwebengine/src/core/ozone/ozone_platform_qt.cpp b/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
+index 33d7bd992b..543e4bd371 100644
+--- a/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
++++ b/qtwebengine/src/core/ozone/ozone_platform_qt.cpp
+@@ -184,29 +184,15 @@ static std::string getCurrentKeyboardLayout()
+     if (XkbRF_GetNamesProp(dpy, nullptr, &vdr) == 0)
+         return std::string();
+
+-    char *layout = strtok(vdr.layout, ",");
+-    for (int i = 0; i < state.group; i++) {
+-        layout = strtok(nullptr, ",");
+-        if (layout == nullptr)
+-            return std::string();
+-    }
++    if (!vdr.layout)
++        return std::string();
+
+     if (!vdr.variant)
+-        return layout;
+-
+-    char *variant = strtok(vdr.variant, ",");
+-    if (!variant)
+-        return layout;
+-
+-    for (int i = 0; i < state.group; i++) {
+-        variant = strtok(nullptr, ",");
+-        if (variant == nullptr)
+-            return layout;
+-    }
++        return std::string(vdr.layout);
+
+-    std::string layoutWithVariant = layout;
++    std::string layoutWithVariant = vdr.layout;
+     layoutWithVariant = layoutWithVariant.append("-");
+-    layoutWithVariant = layoutWithVariant.append(variant);
++    layoutWithVariant = layoutWithVariant.append(vdr.variant);
+     return layoutWithVariant;
+ }
+ #endif // BUILDFLAG(USE_XKBCOMMON)
+--
+2.35.3
\ No newline at end of file
diff --git a/extras/packaging/gnu-linux/rules/snap/common/icons/jami.svg b/extras/packaging/gnu-linux/rules/snap/common/icons/jami.svg
new file mode 100644
index 000000000..808f1327f
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/snap/common/icons/jami.svg
@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 116.3 116.3" style="enable-background:new 0 0 116.3 116.3;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:url(#SVGID_1_);}
+	.st1{fill:url(#SVGID_2_);}
+	.st2{fill:url(#SVGID_3_);}
+	.st3{fill:url(#SVGID_4_);}
+	.st4{fill:url(#SVGID_5_);}
+	.st5{fill:url(#SVGID_6_);}
+	.st6{opacity:0.4;fill:url(#SVGID_7_);enable-background:new    ;}
+	.st7{fill:url(#SVGID_8_);}
+	.st8{fill:url(#SVGID_9_);}
+	.st9{fill:url(#SVGID_10_);}
+	.st10{fill:url(#SVGID_11_);}
+	.st11{fill:url(#SVGID_12_);}
+	.st12{fill:url(#SVGID_13_);}
+	.st13{fill:url(#SVGID_14_);}
+	.st14{fill:url(#SVGID_15_);}
+	.st15{fill:url(#SVGID_16_);}
+	.st16{opacity:0.2;fill:url(#SVGID_17_);enable-background:new    ;}
+	.st17{fill:url(#SVGID_18_);}
+	.st18{fill:url(#SVGID_19_);}
+	.st19{opacity:0.25;fill:url(#SVGID_20_);enable-background:new    ;}
+	.st20{fill:url(#SVGID_21_);}
+	.st21{fill:url(#SVGID_22_);}
+	.st22{opacity:0.2;fill:url(#SVGID_23_);enable-background:new    ;}
+	.st23{fill:url(#SVGID_24_);}
+</style>
+<g>
+	<g>
+		
+			<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="69.0328" y1="454.9245" x2="64.4435" y2="449.5703" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<polygon class="st0" points="54.9,55.8 62,55.6 58.4,62.2   "/>
+		
+			<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="108.534" y1="457.2333" x2="108.534" y2="494.0327" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
+			<stop offset="0.2165" style="stop-color:#2E5589"/>
+			<stop offset="0.3608" style="stop-color:#2B5E97"/>
+			<stop offset="0.5" style="stop-color:#29629C"/>
+			<stop offset="0.6392" style="stop-color:#2B5E97"/>
+			<stop offset="0.7835" style="stop-color:#2E5589"/>
+			<stop offset="0.9296" style="stop-color:#2D4576"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st1" d="M85.5,57.5c26.1,4.2,29.8,10.7,29.8,10.7c0,0.4,0,0.8,0,1.2c0,0.2-0.1,0.4-0.2,0.7c-0.1,0.3-2.7,5.7-19.6,9.3    L85.5,57.5z"/>
+		
+			<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="26.7686" y1="496.8278" x2="38.7091" y2="475.5678" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#252B59"/>
+			<stop offset="8.590000e-02" style="stop-color:#2B3A69"/>
+			<stop offset="0.2267" style="stop-color:#2E4A7C"/>
+			<stop offset="0.3658" style="stop-color:#2E5487"/>
+			<stop offset="0.5" style="stop-color:#2D578C"/>
+			<stop offset="0.6342" style="stop-color:#2E5487"/>
+			<stop offset="0.7733" style="stop-color:#2E4A7C"/>
+			<stop offset="0.9141" style="stop-color:#2B3A69"/>
+			<stop offset="1" style="stop-color:#252B59"/>
+		</linearGradient>
+		<path class="st2" d="M19.8,78.5c-5.9,15.7-2.9,20.6-2.7,21c0.1,0.2,0.2,0.4,0.4,0.5c0.4,0,0.8-0.1,1.2-0.2c0,0,10.7-0.5,23.2-18.3    L19.8,78.5z"/>
+		
+			<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="60.8512" y1="424.6486" x2="41.0872" y2="401.5905" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#181844"/>
+			<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
+			<stop offset="0.1353" style="stop-color:#283261"/>
+			<stop offset="0.2468" style="stop-color:#2D4172"/>
+			<stop offset="0.3647" style="stop-color:#2E4A7C"/>
+			<stop offset="0.5" style="stop-color:#2E4D7F"/>
+			<stop offset="0.6177" style="stop-color:#2D4576"/>
+			<stop offset="0.8125" style="stop-color:#273160"/>
+			<stop offset="1" style="stop-color:#181844"/>
+		</linearGradient>
+		<path class="st3" d="M58.8,18.6C44.5,2.9,37.5,3.8,37.1,3.9c-0.2,0-0.5,0.1-0.7,0.2c-0.5,0.2-1,1.8-1,1.8s-3,8.7,9.1,31.9    L58.8,18.6z"/>
+		
+			<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="99.9721" y1="499.3526" x2="84.7036" y2="450.1664" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#181844"/>
+			<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
+			<stop offset="0.1353" style="stop-color:#283261"/>
+			<stop offset="0.2468" style="stop-color:#2D4172"/>
+			<stop offset="0.3647" style="stop-color:#2E4A7C"/>
+			<stop offset="0.5" style="stop-color:#2E4D7F"/>
+			<stop offset="0.6177" style="stop-color:#2D4576"/>
+			<stop offset="0.8125" style="stop-color:#273160"/>
+			<stop offset="1" style="stop-color:#181844"/>
+		</linearGradient>
+		<path class="st4" d="M71.2,78.8C90.6,101,97.4,99.8,97.4,99.8c0.4,0.1,0.9,0.2,1.3,0.2c0.2-0.1,0.3-0.3,0.4-0.5    c0.3-0.4,5.8-9.4-12.8-41.8L71.2,78.8z"/>
+		
+			<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="31.6447" y1="457.2331" x2="31.6447" y2="494.0317" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
+			<stop offset="0.2165" style="stop-color:#2E5589"/>
+			<stop offset="0.3608" style="stop-color:#2B5E97"/>
+			<stop offset="0.5" style="stop-color:#29629C"/>
+			<stop offset="0.6392" style="stop-color:#2B5E97"/>
+			<stop offset="0.7835" style="stop-color:#2E5589"/>
+			<stop offset="0.9296" style="stop-color:#2D4576"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st5" d="M46.1,82.2c-40-1.7-44.8-11.6-45-12.1C1.1,69.9,1,69.7,1,69.5c0.1-0.7,1.5-2,1.5-2s10.6-6.5,28.3-10    L46.1,82.2z"/>
+		
+			<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="51.8906" y1="421.1236" x2="66.337" y2="421.1236" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st6" d="M57.6,17.4c-5,5.4-9.6,11.2-13.8,17.2h1c3.1-3.9,10.8-13.7,13.4-16.5L57.6,17.4z"/>
+		
+			<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="70.9709" y1="436.4003" x2="70.9709" y2="401.6908" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#252B59"/>
+			<stop offset="0.5" style="stop-color:#2D578C"/>
+			<stop offset="0.6934" style="stop-color:#2D5588"/>
+			<stop offset="0.8038" style="stop-color:#2E4F80"/>
+			<stop offset="0.8932" style="stop-color:#2D4474"/>
+			<stop offset="0.971" style="stop-color:#283463"/>
+			<stop offset="1" style="stop-color:#252B59"/>
+		</linearGradient>
+		<path class="st7" d="M73.8,35.4C84.2,10.7,80.2,5,80.2,5c-0.1-0.3-0.2-0.7-0.3-1c-0.2-0.1-0.4-0.1-0.7-0.2    c-0.5-0.1-11.4-1.5-34.4,30.7L73.8,35.4z"/>
+		
+			<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="39.2669" y1="503.7654" x2="102.6764" y2="407.9172" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="8.239999e-02" style="stop-color:#177EBC"/>
+			<stop offset="0.1675" style="stop-color:#0E91D1"/>
+			<stop offset="0.2527" style="stop-color:#10A2E1"/>
+			<stop offset="0.337" style="stop-color:#18ACEA"/>
+			<stop offset="0.42" style="stop-color:#24B1ED"/>
+			<stop offset="0.5" style="stop-color:#28B1ED"/>
+			<stop offset="0.58" style="stop-color:#24B1ED"/>
+			<stop offset="0.663" style="stop-color:#18ACEA"/>
+			<stop offset="0.7473" style="stop-color:#10A2E1"/>
+			<stop offset="0.8325" style="stop-color:#0E91D1"/>
+			<stop offset="0.9176" style="stop-color:#177EBC"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st8" d="M58,97.4c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8l-17.3-11c7.3-1.6,16.3-10.2,25.7-21.3    L58,97.4z"/>
+		
+			<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="33.568" y1="505.6873" x2="58.683" y2="483.2007" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2C5D95"/>
+			<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
+			<stop offset="0.1808" style="stop-color:#1B79B9"/>
+			<stop offset="0.3007" style="stop-color:#1080C2"/>
+			<stop offset="0.5" style="stop-color:#0E81C5"/>
+			<stop offset="0.6993" style="stop-color:#1080C2"/>
+			<stop offset="0.8192" style="stop-color:#1B79B9"/>
+			<stop offset="0.9178" style="stop-color:#246EAB"/>
+			<stop offset="1" style="stop-color:#2C5D95"/>
+		</linearGradient>
+		<path class="st9" d="M58.6,98c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8L17.6,100c7.3-1.6,16.9-9.6,26.3-20.7    L58.6,98z"/>
+		
+			<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="31.3212" y1="407.2591" x2="89.6399" y2="504.4568" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2C5D95"/>
+			<stop offset="1.760000e-02" style="stop-color:#2A6199"/>
+			<stop offset="0.1407" style="stop-color:#1C79B7"/>
+			<stop offset="0.2631" style="stop-color:#0A8CCA"/>
+			<stop offset="0.3837" style="stop-color:#0B97D4"/>
+			<stop offset="0.5" style="stop-color:#0E9AD8"/>
+			<stop offset="0.6163" style="stop-color:#0B97D4"/>
+			<stop offset="0.7369" style="stop-color:#0A8CCA"/>
+			<stop offset="0.8593" style="stop-color:#1C79B7"/>
+			<stop offset="0.9824" style="stop-color:#2A6199"/>
+			<stop offset="1" style="stop-color:#2C5D95"/>
+		</linearGradient>
+		<path class="st10" d="M20.7,38c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2l17.3-11c-1.5,7.1,2.3,18,8.2,30.7L20.7,38z"/>
+		
+			<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="94.4028" y1="503.8655" x2="56.9038" y2="456.6339" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2C5D95"/>
+			<stop offset="2.570000e-02" style="stop-color:#2A6199"/>
+			<stop offset="0.2053" style="stop-color:#1C79B7"/>
+			<stop offset="0.384" style="stop-color:#0A8CCA"/>
+			<stop offset="0.5599" style="stop-color:#0B97D4"/>
+			<stop offset="0.7296" style="stop-color:#0E9AD8"/>
+			<stop offset="0.7925" style="stop-color:#0B97D4"/>
+			<stop offset="0.8577" style="stop-color:#0A8CCA"/>
+			<stop offset="0.9239" style="stop-color:#1C79B7"/>
+			<stop offset="0.9905" style="stop-color:#2A6199"/>
+			<stop offset="1" style="stop-color:#2C5D95"/>
+		</linearGradient>
+		<path class="st11" d="M57.2,57.2c-8.7,0-17.4,0.7-26,1.9c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41    c0.6-0.2,1.2-0.5,1.7-0.8l17.3-11C87,97.5,70.6,78.2,57.2,57.2z"/>
+		
+			<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="40.2175" y1="431.0724" x2="32.9164" y2="404.7886" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2C5D95"/>
+			<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
+			<stop offset="0.1808" style="stop-color:#1B79B9"/>
+			<stop offset="0.3007" style="stop-color:#1080C2"/>
+			<stop offset="0.5" style="stop-color:#0E81C5"/>
+			<stop offset="0.6993" style="stop-color:#1080C2"/>
+			<stop offset="0.8192" style="stop-color:#1B79B9"/>
+			<stop offset="0.9178" style="stop-color:#246EAB"/>
+			<stop offset="1" style="stop-color:#2C5D95"/>
+		</linearGradient>
+		<path class="st12" d="M20.1,38.5c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2L36.5,4.1c-1.5,7.1,1.7,18.6,7.6,31.2    L20.1,38.5z"/>
+		
+			<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="122.9025" y1="448.7971" x2="9.1479" y2="448.7971" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="1.280000e-02" style="stop-color:#256BA7"/>
+			<stop offset="0.1121" style="stop-color:#0B83C3"/>
+			<stop offset="0.2115" style="stop-color:#1797D8"/>
+			<stop offset="0.3099" style="stop-color:#25A3E2"/>
+			<stop offset="0.4066" style="stop-color:#27ABE7"/>
+			<stop offset="0.5" style="stop-color:#2AAEEA"/>
+			<stop offset="0.5934" style="stop-color:#27ABE7"/>
+			<stop offset="0.6901" style="stop-color:#25A3E2"/>
+			<stop offset="0.7885" style="stop-color:#1797D8"/>
+			<stop offset="0.8879" style="stop-color:#0B83C3"/>
+			<stop offset="0.9872" style="stop-color:#256BA7"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st13" d="M85.5,59.6c13.5,1.9,24.7,4.7,29.8,9.8V48.9c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,59.6z"/>
+		
+			<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="90.2941" y1="447.1362" x2="122.8074" y2="448.8884" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2E5284"/>
+			<stop offset="6.100000e-03" style="stop-color:#2E5486"/>
+			<stop offset="9.120000e-02" style="stop-color:#29649D"/>
+			<stop offset="0.1876" style="stop-color:#236FAD"/>
+			<stop offset="0.3049" style="stop-color:#1D77B6"/>
+			<stop offset="0.5" style="stop-color:#1C78B9"/>
+			<stop offset="0.6951" style="stop-color:#1D77B6"/>
+			<stop offset="0.8124" style="stop-color:#236FAD"/>
+			<stop offset="0.9088" style="stop-color:#29649D"/>
+			<stop offset="0.9939" style="stop-color:#2E5486"/>
+			<stop offset="1" style="stop-color:#2E5284"/>
+		</linearGradient>
+		<path class="st14" d="M85.5,58.8c13.5,1.9,24.7,5.5,29.8,10.6V48.1c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,58.8z"/>
+		
+			<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="9.0577" y1="447.1912" x2="67.7186" y2="447.1912" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="2.250000e-02" style="stop-color:#256BA7"/>
+			<stop offset="0.1971" style="stop-color:#0B83C3"/>
+			<stop offset="0.3718" style="stop-color:#1797D8"/>
+			<stop offset="0.5447" style="stop-color:#25A3E2"/>
+			<stop offset="0.7147" style="stop-color:#27ABE7"/>
+			<stop offset="0.8788" style="stop-color:#2AAEEA"/>
+			<stop offset="0.9015" style="stop-color:#27ABE7"/>
+			<stop offset="0.9249" style="stop-color:#25A3E2"/>
+			<stop offset="0.9487" style="stop-color:#1797D8"/>
+			<stop offset="0.9728" style="stop-color:#0B83C3"/>
+			<stop offset="0.9969" style="stop-color:#256BA7"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st15" d="M73.2,35.1c-3-0.1-9.5-0.4-15.1-0.4C7.1,34.7,1.4,46.5,1.2,47C1,47.6,1,48.3,1,48.9v20.6    c5-5,15.9-7.7,29.2-9.7c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C60.8,57.8,76.3,35.2,73.2,35.1z"/>
+		
+			<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="50.3126" y1="432.0108" x2="28.2664" y2="428.9106" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st16" d="M44.1,33.5c-10.7,0.5-18.4,1.3-24.8,3.1l0.3,0.8c0.6-0.1,1.3-0.3,1.9-0.4c7.7-1.2,15.4-2,23.1-2.3L44.1,33.5    z"/>
+		
+			<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="72.7451" y1="450.8669" x2="10.4435" y2="442.1056" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
+			<stop offset="0.1177" style="stop-color:#0B86C4"/>
+			<stop offset="0.2081" style="stop-color:#0A94D2"/>
+			<stop offset="0.3177" style="stop-color:#0C9BDB"/>
+			<stop offset="0.5" style="stop-color:#109EDE"/>
+			<stop offset="0.6823" style="stop-color:#0C9BDB"/>
+			<stop offset="0.7919" style="stop-color:#0A94D2"/>
+			<stop offset="0.8823" style="stop-color:#0B86C4"/>
+			<stop offset="0.9618" style="stop-color:#2174B1"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st17" d="M73.2,34.3c-3-0.1-9.5-0.4-15.1-0.4c-51.1,0-56.7,11.8-57,12.4C1,46.8,1,47.5,1,48.1v21.4    c5-5,15.9-8.5,29.2-10.5c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C63.2,57.1,76.3,34.4,73.2,34.3z"/>
+		
+			<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="101.6202" y1="407.733" x2="71.9933" y2="458.7571" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="0.1238" style="stop-color:#177EBC"/>
+			<stop offset="0.2516" style="stop-color:#0E91D1"/>
+			<stop offset="0.3797" style="stop-color:#10A2E1"/>
+			<stop offset="0.5064" style="stop-color:#18ACEA"/>
+			<stop offset="0.631" style="stop-color:#24B1ED"/>
+			<stop offset="0.7513" style="stop-color:#28B1ED"/>
+			<stop offset="0.7911" style="stop-color:#24B1ED"/>
+			<stop offset="0.8324" style="stop-color:#18ACEA"/>
+			<stop offset="0.8743" style="stop-color:#10A2E1"/>
+			<stop offset="0.9167" style="stop-color:#0E91D1"/>
+			<stop offset="0.959" style="stop-color:#177EBC"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st18" d="M58.2,58.8C72.1,37.9,82.4,16,79.8,4.1l17.3,11c0.5,0.3,1,0.7,1.4,1.2c0.3,0.5,7.1,11.7-20.7,54.5    c-2,3.2-3.9,6.9-4.6,7.2c-4.1-4-12.6-15.6-14.7-18.5C58.3,59.1,58.2,58.8,58.2,58.8z"/>
+		
+			<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="105.3445" y1="433.3988" x2="94.5575" y2="453.6416" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st19" d="M96.6,37.2c-3.1,7.8-6.8,15.3-11.1,22.4l1.3,0.2c5.5-9.5,8.7-16.5,10.9-22.4L96.6,37.2z"/>
+		
+			<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="100.6479" y1="408.8533" x2="70.927" y2="464.6275" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
+			<stop offset="0.1177" style="stop-color:#0B86C4"/>
+			<stop offset="0.2081" style="stop-color:#0A94D2"/>
+			<stop offset="0.3177" style="stop-color:#0C9BDB"/>
+			<stop offset="0.5" style="stop-color:#109EDE"/>
+			<stop offset="0.6823" style="stop-color:#0C9BDB"/>
+			<stop offset="0.7919" style="stop-color:#0A94D2"/>
+			<stop offset="0.8823" style="stop-color:#0B86C4"/>
+			<stop offset="0.9618" style="stop-color:#2174B1"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st20" d="M78.5,71.4c27.8-42.8,21-54,20.7-54.5c-0.4-0.5-0.9-0.9-1.4-1.2L79.8,4.1c2.5,11.8-7.4,34.6-21.2,55.5    c4.6,7.1,9.4,14,14.5,19.9C74.1,78.3,76.7,74.3,78.5,71.4z"/>
+		
+			<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="102.9539" y1="410.1097" x2="72.9714" y2="466.375" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2867A2"/>
+			<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
+			<stop offset="0.1177" style="stop-color:#0B86C4"/>
+			<stop offset="0.2081" style="stop-color:#0A94D2"/>
+			<stop offset="0.3177" style="stop-color:#0C9BDB"/>
+			<stop offset="0.5" style="stop-color:#109EDE"/>
+			<stop offset="0.6823" style="stop-color:#0C9BDB"/>
+			<stop offset="0.7919" style="stop-color:#0A94D2"/>
+			<stop offset="0.8823" style="stop-color:#0B86C4"/>
+			<stop offset="0.9618" style="stop-color:#2174B1"/>
+			<stop offset="1" style="stop-color:#2867A2"/>
+		</linearGradient>
+		<path class="st21" d="M72.6,80.2c0.1-0.1,0.2-0.1,0.2-0.2c-5.3-6.2-10.2-12.8-14.7-19.7c-0.1,0.1-0.2,0.2-0.2,0.4    C57.9,60.6,67.6,75.9,72.6,80.2z"/>
+		
+			<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="54.5637" y1="474.0854" x2="62.254" y2="494.9197" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2B3B6A"/>
+			<stop offset="1" style="stop-color:#2B3B6A"/>
+		</linearGradient>
+		<path class="st22" d="M58.2,98.4C57.9,98.1,47.7,86.1,43.1,79l-0.8,0.9C46.9,86.6,52,93,57.6,99L58.2,98.4z"/>
+		
+			<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="69.1674" y1="452.6575" x2="78.2209" y2="509.0225" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
+			<stop offset="0" style="stop-color:#2E5284"/>
+			<stop offset="2.440000e-02" style="stop-color:#2C5C92"/>
+			<stop offset="8.880000e-02" style="stop-color:#2075B1"/>
+			<stop offset="0.1599" style="stop-color:#0B86C4"/>
+			<stop offset="0.2403" style="stop-color:#0A94D2"/>
+			<stop offset="0.3378" style="stop-color:#0E9CDA"/>
+			<stop offset="0.5" style="stop-color:#109EDE"/>
+			<stop offset="0.6718" style="stop-color:#0C9BDB"/>
+			<stop offset="0.7751" style="stop-color:#0A94D2"/>
+			<stop offset="0.8603" style="stop-color:#0B86C4"/>
+			<stop offset="0.9351" style="stop-color:#2174B1"/>
+			<stop offset="1" style="stop-color:#2C5D95"/>
+		</linearGradient>
+		<path class="st23" d="M72.9,79.9c-5.3-6.2-10.2-12.8-14.7-19.7c-0.5-0.8-1.1-1.6-1.6-2.4c-8.7,0-17.4,0.7-26,1.9    c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41c0.6-0.2,1.2-0.5,1.7-0.8L98.8,100C91.4,98.4,82.1,90.6,72.9,79.9z"/>
+	</g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/extras/packaging/gnu-linux/rules/snap/common/scripts/jami-wrapper b/extras/packaging/gnu-linux/rules/snap/common/scripts/jami-wrapper
new file mode 100755
index 000000000..d2b999b82
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/snap/common/scripts/jami-wrapper
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+export QTWEBENGINEPROCESS_PATH="$SNAP/usr/lib/libqt-jami/libexec/QtWebEngineProcess"
+
+exec "$@"
diff --git a/extras/packaging/gnu-linux/rules/snap/jami/snapcraft.yaml b/extras/packaging/gnu-linux/rules/snap/jami/snapcraft.yaml
new file mode 100644
index 000000000..21d554d03
--- /dev/null
+++ b/extras/packaging/gnu-linux/rules/snap/jami/snapcraft.yaml
@@ -0,0 +1,367 @@
+# Copyright (C) 2019-2022 Savoir-faire Linux Inc.
+#
+# Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# This file is based on earlier work by Dani Llewellyn, under the
+# Expat License (also referred to as "the MIT License"), per the
+# following notice:
+
+# Copyright (C) 2017-2020 Dani Llewellyn <dani@bowlhat.net>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+name: jami
+version: "RELEASE_VERSION"
+adopt-info: jami
+icon: common/icons/jami.svg
+license: GPL-3.0+
+summary: 'Privacy-oriented voice, video, chat, and conference platform and SIP phone'
+description: |
+  Jami is free software for universal communication that respects the
+  freedom and privacy of its users.
+
+  Jami is an end-to-end encrypted secure and distributed voice, video,
+  and chat communication platform.  Jami requires no central server
+  for these communications and leaves the power of privacy and freedom
+  in the hands of users.
+
+  Jami provides the following key features to its users:
+
+  * Synchronized and enriched one-to-one conversations
+  * Group conversations (Beta)
+  * Audio/video calls and conferences
+  * Screen sharing in video calls and conferences
+  * Unlimited peer-to-peer file sharing
+  * Recording and sending audio/video messages
+  * Jami plugins SDK for additional functionality (green screen,
+    watermark, audio filters, and more)
+  * Use Jami as your SIP phone with a variety of media codecs
+    and VoIP providers
+
+  Client applications for GNU/Linux, Windows, macOS, iOS, Android,
+  and Android TV are available, making Jami an interoperable and
+  cross-platform communication framework.
+
+  Seamlessly deploy Jami in your organization using
+  Jami Account Management Server (JAMS).   With JAMS, you can enable
+  your users to connect using their LDAP/ActiveDirectory credentials
+  or create local accounts, enabling you to manage your own
+  Jami community while taking advantage of Jami's distributed network
+  architecture.  For more information, please visit https://jami.biz.
+
+confinement: strict
+grade: stable
+base: core20
+
+plugs:
+  gnome-3-38-2004:
+    interface: content
+    target: $SNAP/gnome-platform
+    default-provider: gnome-3-38-2004:gnome-3-38-2004
+  gtk-3-themes:
+    interface: content
+    target: $SNAP/data-dir/themes
+    default-provider: gtk-common-themes:gtk-3-themes
+  icon-themes:
+    interface: content
+    target: $SNAP/data-dir/icons
+    default-provider: gtk-common-themes:icon-themes
+  sound-themes:
+    interface: content
+    target: $SNAP/data-dir/sounds
+    default-provider: gtk-common-themes:sounds-themes
+
+slots:
+  dbus-jami:
+    interface: dbus
+    bus: session
+    name: net.jami.Jami
+  dbus-ring:
+    interface: dbus
+    bus: session
+    name: cx.ring.Ring
+
+layout:
+  /usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib:
+    bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib
+  /usr/share/alsa:
+    bind: $SNAP/usr/share/alsa
+  /usr/share/X11/xkb:
+    bind: $SNAP/usr/share/X11/xkb
+
+environment:
+  XDG_CURRENT_DESKTOP: Unity
+  QT_BASE_DIR: "/usr/lib/libqt-jami"
+  LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP$QT_BASE_DIR/lib"
+
+apps:
+  jami:
+    command: usr/bin/jami
+    command-chain:
+    - bin/desktop-launch
+    - snap/command-chain/alsa-launch
+    - bin/jami-wrapper
+    autostart: jami.desktop
+    common-id: net.jami.Jami
+    desktop: usr/share/applications/jami.desktop
+    slots:
+    - dbus-jami
+    - dbus-ring
+    plugs:
+    - alsa
+    - audio-playback
+    - audio-record
+    - browser-support
+    - camera
+    - desktop
+    - desktop-legacy
+    - gsettings
+    - hardware-observe
+    - home
+    - network
+    - network-bind
+    - network-manager
+    - opengl
+    - removable-media
+    - screen-inhibit-control
+    - system-observe
+    - unity7
+    - wayland
+    - x11
+
+package-repositories:
+  - type: apt
+    components: [main]
+    suites: [jami]
+    key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
+    url: https://dl.jami.net/nightly/ubuntu_20.04/
+
+parts:
+  desktop-launch:
+    source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
+    plugin: nil
+    build-packages:
+    - dpkg-dev
+    - gcc
+    - g++
+    - cmake
+    - cmake-data
+    - libqt-jami
+    - devscripts
+    - equivs
+    override-pull: |
+      snapcraftctl pull
+      sed -i -E 's|\. \$SNAP/flavor-select|USE_gtk3=true|' gtk/launcher-specific
+      sed -i -E 's|\. \$SNAP/flavor-select|USE_qt5=true|' qt/launcher-specific
+      sed -i -E 's|(append_dir GTK_PATH \$RUNTIME/usr/lib/\$ARCH/gtk-2.0)|#\1|' qt/launcher-specific
+      sed -i -E 's|\$RUNTIME|$SNAP|g' qt/launcher-specific
+      sed -i -E 's|\$WITH_RUNTIME|no|g' qt/launcher-specific
+    override-build: |
+      snapcraftctl build
+      gcc -Wall -O2 -o bindtextdomain.so -fPIC -shared src/bindtextdomain.c -ldl
+
+      echo "#!/bin/bash" > desktop-launch
+      cat common/init >> desktop-launch
+
+      cat qt/runtime-exports >> desktop-launch
+      cat gtk/runtime-exports >> desktop-launch
+
+      cat common/desktop-exports >> desktop-launch
+
+      cat qt/launcher-specific >> desktop-launch
+      cat gtk/launcher-specific >> desktop-launch
+
+      cat common/mark-and-exec >> desktop-launch
+
+      install -D -m755 desktop-launch $SNAPCRAFT_PART_INSTALL/bin/desktop-launch
+      install -D -m644 bindtextdomain.so $SNAPCRAFT_PART_INSTALL/lib/bindtextdomain.so
+
+      mkdir -pv $SNAPCRAFT_PART_INSTALL/gnome-platform
+
+  scripts:
+    plugin: dump
+    source: common/scripts
+    organize:
+      jami-wrapper: bin/jami-wrapper
+
+  alsa-mixin:
+    plugin: dump
+    source: https://github.com/diddlesnaps/snapcraft-alsa.git
+    source-subdir: snapcraft-assets
+    stage:
+      - -usr/lib/x86_64-linux-gnu/libp11-kit.so*
+      - -usr/lib/x86_64-linux-gnu/libproxy.so*
+      - -usr/share/doc/libp11-kit0/changelog.Debian.gz
+      - -usr/share/doc/libproxy1v5/changelog.Debian.gz
+    build-packages:
+      - libasound2-dev
+    stage-packages:
+      - libasound2
+      - libasound2-plugins
+      - yad
+
+  jami:
+    after: [alsa-mixin]
+    source: .
+    plugin: nil
+    parse-info: [usr/share/metainfo/jami.appdata.xml]
+    stage:
+      - -usr/lib/x86_64-linux-gnu/liblber-2.4.so*
+      - -usr/lib/x86_64-linux-gnu/libldap_r-2.4.so*
+      - -usr/share/doc/libldap-2.4-2/changelog.Debian.gz
+      - -usr/share/doc/libldap-common/changelog.Debian.gz
+    build-environment:
+      - QT_BASE_DIR: "/usr/lib/libqt-jami"
+      - PATH: "$QT_BASE_DIR/bin:$PATH"
+      - LD_LIBRARY_PATH: "$QT_BASE_DIR/lib:$LD_LIBRARY_PATH"
+      - PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH"
+    override-pull: |
+      ls
+      snapcraftctl pull
+      sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
+      sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/jami.svg|' extras/data/jami.desktop
+    override-build: |
+      cd $SNAPCRAFT_PART_BUILD/daemon/contrib
+      mkdir -p native
+      cd native
+      ../bootstrap
+      make .ffmpeg
+      make
+
+      cd $SNAPCRAFT_PART_BUILD/daemon
+      ./autogen.sh
+      ./configure --prefix=/usr --without-dbus
+      make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
+      DESTDIR=$SNAPCRAFT_PART_INSTALL make install
+
+      cd $SNAPCRAFT_PART_BUILD/
+      mkdir build
+      cd build
+      cmake .. -DENABLE_LIBWRAP=true \
+               -DLIBJAMI_BUILD_DIR=$SNAPCRAFT_PART_BUILD/daemon/src \
+               -DCMAKE_INSTALL_PREFIX=/usr \
+               -DCMAKE_BUILD_TYPE=Release
+      make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
+      DESTDIR=$SNAPCRAFT_PART_INSTALL make install
+    build-packages:
+    - autoconf
+    - autoconf-archive
+    - automake
+    - autopoint
+    - bzip2
+    - curl
+    - gcc
+    - g++
+    - gettext
+    - gzip
+    - libnotify-dev
+    - libqrencode-dev
+    - libsndfile1-dev
+    - libspeex-dev
+    - python3
+    - python3-dev
+    - uuid-dev
+    - yasm
+    - wget
+    - nasm # ffmpeg
+    - libavcodec-dev
+    - libavdevice-dev
+    - libavformat-dev
+    - libswscale-dev
+    - libva-dev
+    - libvdpau-dev
+    - libargon2-0-dev # opendht
+    - libexpat1-dev
+    - libjsoncpp-dev
+    - libnm-dev # connectivityChanged()
+    - libdbus-1-dev # dbus
+    - libdbus-c++-dev
+    - libpulse-dev # pulse
+    - libudev-dev
+    - libglu1-mesa-dev # Qt 6
+    - zlib1g-dev
+    - libgl-dev
+    - libvulkan-dev
+    - libgnutls28-dev # TLS
+    - gnutls-bin
+    - libssl-dev
+    stage-packages:
+    - libgnutls30
+    - libavutil56
+    - libdouble-conversion3
+    - libegl1
+    - libgbm1
+    - libgstreamer-gl1.0-0
+    - libgstreamer-plugins-base1.0-0
+    - libgstreamer1.0-0
+    - libgudev-1.0-0
+    - libjsoncpp1
+    - libllvm12
+    - libminizip1
+    - libnm0
+    - libnotify4
+    - libnspr4
+    - libnss3
+    - libopengl0
+    - libopus0
+    - liborc-0.4-0
+    - libpcre2-16-0
+    - libqrencode4
+    - libqt-jami
+    - libsnappy1v5
+    - libspeex1
+    - libproxy1v5
+    - libwayland-server0
+    - libwebpdemux2
+    - libwebpmux3
+    - libxkbfile1
+    - libxtst6
+    - ocl-icd-libopencl1
+    - libva-drm2
+    - libva-glx2
+    - libva-wayland2
+    - libva2
+    - libvdpau-va-gl1
+    - libvdpau1
+    - va-driver-all
+    prime:
+    - -usr/lib/libqt-jami/bin/
+    - -usr/lib/libqt-jami/docs/
+    - -usr/lib/libqt-jami/examples/
+    - -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libLLVM-*.so*
+    - -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libclang-*.so*
+    - -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libflite*.so*
diff --git a/extras/packaging/gnu-linux/scripts/build-package-debian.sh b/extras/packaging/gnu-linux/scripts/build-package-debian.sh
new file mode 100755
index 000000000..8257369cd
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/build-package-debian.sh
@@ -0,0 +1,135 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2016-2021 Savoir-faire Linux Inc.
+#
+# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script is used in the packaging containers to build packages on
+# debian-based distros.
+#
+set -e
+
+DPKG_BUILD_OPTIONS=""
+# Set the host architecture as armhf and add some specific architecture
+# options to the package builder.
+if grep -q "raspbian_10_armhf" <<< "${DISTRIBUTION}"; then
+    echo "Adding armhf as the host architecture."
+    export HOST_ARCH=arm-linux-gnueabihf
+    DPKG_BUILD_OPTIONS="${DPKG_BUILD_OPTIONS} -a armhf"
+fi
+
+cache_packaging=$TARBALLS/$DISTRIBUTION
+mkdir -p "$cache_packaging"
+
+deb_arch=$(dpkg --print-architecture)
+qt_deb_name=libqt-jami_${DEBIAN_QT_VERSION}_${deb_arch}.deb
+qt_deb_path=${cache_packaging}/${qt_deb_name}
+
+QUILT_REFRESH_ARGS="-p 1"
+
+if [ ! -f "${qt_deb_path}" ] || [ "${FORCE_REBUILD_QT}" = "true" ]; then
+    (
+        flock 9                 # block until the lock file is gone
+        test -f "${qt_deb_path}" && exit 0 # check again
+
+        # Build Qt.
+        mkdir /opt/libqt-jami-build
+        cd /opt/libqt-jami-build
+
+        qt_version=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
+        tarball_name=qt-everywhere-src-${qt_version}.tar.xz
+        cached_tarball=$TARBALLS/$tarball_name
+        qt_base_url=https://download.qt.io/archive/qt/\
+${QT_MAJOR}.${QT_MINOR}/${qt_version}/single
+
+        if [ ! -d "${TARBALLS}" ] || [ ! -w "${TARBALLS}" ]; then
+            echo "error: $TARBALLS does not exist or is not writable"
+            exit 1
+        fi
+
+        if [ ! -f "${cached_tarball}" ]; then
+            (
+                flock 8         # block until the lock file is gone
+                test -f "${cached_tarball}" && exit 0 # check again
+
+                temp_dir=$(mktemp -d)
+                cd "${temp_dir}"
+                wget "${qt_base_url}/${tarball_name}"
+                echo -n "${QT_TARBALL_CHECKSUM}  ${tarball_name}" | sha256sum -c - || \
+                    (echo "Qt tarball checksum mismatch; quitting" && exit 1)
+                mv "${tarball_name}" "${cached_tarball}"
+                rm -rf "${temp_dir}"
+            ) 8>"${cached_tarball}.lock"
+
+        fi
+
+        cp "${cached_tarball}" "libqt-jami_${qt_version}.orig.tar.xz"
+        tar xvf "libqt-jami_${qt_version}.orig.tar.xz"
+        mv "qt-everywhere-src-${qt_version}" "libqt-jami-${qt_version}"
+        cd "libqt-jami-${qt_version}"
+
+        # Extract the debian folder
+        tar xf "/src/$RELEASE_TARBALL_FILENAME" client-qt/extras/packaging/gnu-linux/rules/debian-qt \
+            --strip-components=5 && mv debian-qt debian
+
+        # Create the changelog file.
+        DEBEMAIL="The Jami project <jami@gnu.org>" dch --create \
+                --package libqt-jami \
+                --newversion "${DEBIAN_QT_VERSION}" "New libqt-jami release"
+        DEBEMAIL="The Jami project <jami@gnu.org>" dch --release \
+                --distribution "unstable" debian/changelog
+
+        # Build and package Qt.
+        dpkg-buildpackage -uc -us -d ${DPKG_BUILD_OPTIONS}
+
+        # Cache the built .deb.
+        mv "../${qt_deb_name}" "${qt_deb_path}"
+
+    ) 9>"${qt_deb_path}.lock"
+fi
+
+# install libqt-jami from cache
+apt-get install -y "${qt_deb_path}"
+
+# copy libqt-jami to output
+cp "${qt_deb_path}" /opt/output/
+
+# Set up work directory.
+mkdir -p /jami/work && cd /jami/work
+
+# Create a changelog file, required by dpkg-buildpackage.
+mkdir debian
+DEBEMAIL="The Jami project <jami@gnu.org>" dch --create --package jami \
+        --newversion "${DEBIAN_VERSION}" "Automatic nightly release"
+DEBEMAIL="The Jami project <jami@gnu.org>" dch --release \
+        --distribution "unstable" debian/changelog
+
+# Unpack the source tarball.
+tar -xvf /src/"$RELEASE_TARBALL_FILENAME" --strip-components=1
+
+# Expose the debian directory from here, augmented with the changelog.
+cp debian/changelog extras/packaging/gnu-linux/rules/debian
+rm -r debian
+ln -s extras/packaging/gnu-linux/rules/debian .
+
+# Create the binary packages.
+dpkg-buildpackage -b -uc -us ${DPKG_BUILD_OPTIONS}
+
+# Move the artifacts to the output.
+mv ../*deb /opt/output        # .deb and .ddeb packages
+chown -R "${CURRENT_UID}:${CURRENT_UID}" /opt/output
diff --git a/extras/packaging/gnu-linux/scripts/build-package-rpm.sh b/extras/packaging/gnu-linux/scripts/build-package-rpm.sh
new file mode 100755
index 000000000..522578129
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/build-package-rpm.sh
@@ -0,0 +1,149 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2016-2021 Savoir-faire Linux Inc.
+#
+# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
+# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script is used in the packaging containers to build packages on
+# rpm-based distros.
+#
+set -e
+
+# Import the spec file.
+mkdir -p /opt/client-qt
+cd /opt/client-qt
+tar xf "/src/$RELEASE_TARBALL_FILENAME" client-qt/extras/packaging/gnu-linux/rules/rpm \
+    --strip-components=5 && mv rpm/* . && rmdir rpm
+rm jami-libqt.spec
+
+# Prepare the build tree.
+rpmdev-setuptree
+
+# Copy the source tarball.
+cp --reflink=auto "/src/$RELEASE_TARBALL_FILENAME" /root/rpmbuild/SOURCES
+
+cp patches/0001-qtbug-101201-fatal-error-getcurrenkeyboard.patch /root/rpmbuild/SOURCES/
+
+QT_JAMI_PREFIX="/usr/lib64/qt-jami"
+PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
+LD_LIBRARY_PATH="${QT_JAMI_PREFIX}/lib:${LD_LIBRARY_PATH}"
+PKG_CONFIG_PATH="${QT_JAMI_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
+QT_MAJOR=6
+QT_MINOR=2
+QT_PATCH=3
+QT_RELEASE_PATCH=5
+
+QT_MAJOR_MINOR=${QT_MAJOR}.${QT_MINOR}
+QT_MAJOR_MINOR_PATCH=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
+
+QT_TARBALL_URL=https://download.qt.io/archive/qt/$QT_MAJOR_MINOR/\
+$QT_MAJOR_MINOR_PATCH/single/qt-everywhere-src-$QT_MAJOR_MINOR_PATCH.tar.xz
+
+QT_TARBALL_SHA256="f784998a159334d1f47617fd51bd0619b9dbfe445184567d2cd7c820ccb12771"
+QT_TARBALL_FILE_NAME=$(basename "$QT_TARBALL_URL")
+CACHED_QT_TARBALL=$TARBALLS/$QT_TARBALL_FILE_NAME
+
+mkdir -p "$TARBALLS/$DISTRIBUTION"
+RPM_PATH=$TARBALLS/$DISTRIBUTION/jami-libqt-$QT_MAJOR_MINOR_PATCH-${QT_RELEASE_PATCH}.x86_64.rpm
+if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
+    RPM_PATH=$TARBALLS/${DISTRIBUTION}/jami-libqt-$QT_MAJOR_MINOR_PATCH-${QT_RELEASE_PATCH}.el8.x86_64.rpm
+fi
+
+if [ ! -f "${RPM_PATH}" ]; then
+    # The following block will only run on one build machine at a
+    # time, thanks to flock.
+    (
+        flock 9             # block until the lock is available
+        test -f "$RPM_PATH" && exit 0 # check again
+
+        mkdir /opt/qt-jami-build
+        cd /opt/qt-jami-build
+        tar xf "/src/$RELEASE_TARBALL_FILENAME" \
+            client-qt/extras/packaging/gnu-linux/rules/rpm/jami-libqt.spec \
+            --strip-components=6
+
+        # Fetch and cache the tarball, if not already available.
+        if [ ! -f "$CACHED_QT_TARBALL" ]; then
+            (
+                flock 8     # block until the lock file is gone
+                test -f "$CACHED_QT_TARBALL" && exit 0 # check again
+
+                wget "$QT_TARBALL_URL"
+                if ! echo -n ${QT_TARBALL_SHA256} "$QT_TARBALL_FILE_NAME" | sha256sum -c -
+                then
+                    echo "qt tarball checksum mismatch; quitting"
+                    exit 1
+                fi
+                mv "$QT_TARBALL_FILE_NAME" "$CACHED_QT_TARBALL"
+            ) 8>"${CACHED_QT_TARBALL}.lock"
+        fi
+
+        cp "$CACHED_QT_TARBALL" "/root/rpmbuild/SOURCES/jami-qtlib_$QT_MAJOR_MINOR_PATCH.tar.xz"
+        sed -i "s/RELEASE_VERSION/$QT_MAJOR_MINOR_PATCH/g" jami-libqt.spec
+        rpmdev-bumpspec --comment="Automatic nightly release" \
+                        --userstring="Jenkins <jami@lists.savoirfairelinux.net>" jami-libqt.spec
+
+        rpmbuild --define "debug_package %{nil}" -ba jami-libqt.spec
+        # Note: try to remove with Qt > 6. Else we have a problem with $ORIGIN
+        mkdir -p "$TARBALLS/${DISTRIBUTION}"
+
+        # Cache the built Qt RPM package.
+        if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el8.x86_64.rpm "${RPM_PATH}"
+        elif [[ "${DISTRIBUTION}" == "fedora_33" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc33.x86_64.rpm "${RPM_PATH}"
+        elif [[ "${DISTRIBUTION}" == "fedora_34" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc34.x86_64.rpm "${RPM_PATH}"
+        elif [[ "${DISTRIBUTION}" == "fedora_35" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc35.x86_64.rpm "${RPM_PATH}"
+        elif [[ "${DISTRIBUTION}" == "fedora_36" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc36.x86_64.rpm "${RPM_PATH}"
+        elif [[ "${DISTRIBUTION}" == "fedora_37" ]]; then
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc37.x86_64.rpm "${RPM_PATH}"
+        else
+            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm "${RPM_PATH}"
+        fi
+    ) 9>"${RPM_PATH}.lock"
+fi
+rpm --install "${RPM_PATH}"
+cp "${RPM_PATH}" /opt/output
+cd /opt/client-qt
+
+# Set the version and associated comment.
+sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" ./*.spec
+rpmdev-bumpspec --comment="Automatic nightly release" \
+                --userstring="Jenkins <jami@lists.savoirfairelinux.net>" ./*.spec
+
+# Build the daemon and install it.
+rpmbuild --define "debug_package %{nil}" -ba jami-daemon.spec
+rpm --install /root/rpmbuild/RPMS/x86_64/jami-daemon-*
+
+# Build the temporary transitional packages.
+rpmbuild --define "debug_package %{nil}" -ba jami-libclient.spec
+rpmbuild --define "debug_package %{nil}" -ba jami-qt.spec
+
+# Build the Qt client.
+rpmbuild --define "debug_package %{nil}" -ba jami.spec
+
+# Move the built packages to the output directory.
+mv /root/rpmbuild/RPMS/*/* /opt/output
+touch /opt/output/.packages-built
+chown -R "$CURRENT_UID:$CURRENT_UID" /opt/output
+
+# TODO: One click install: create a package that combines the already
+# built package into one.
diff --git a/extras/packaging/gnu-linux/scripts/build-package-snap.sh b/extras/packaging/gnu-linux/scripts/build-package-snap.sh
new file mode 100755
index 000000000..f6261ae18
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/build-package-snap.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2020-2021 Savoir-faire Linux Inc.
+#
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script is used in the packaging containers to build a snap
+# package on an ubuntu base distro.
+
+
+set -e
+
+tar xf "/src/$RELEASE_TARBALL_FILENAME" -C /opt
+cd /opt/client-qt/
+cp -r extras/packaging/gnu-linux/rules/snap/common .
+cp -r extras/packaging/gnu-linux/rules/snap/${SNAP_PKG_NAME}/snapcraft.yaml .
+
+# set the version and tarball filename
+sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" snapcraft.yaml
+
+snapcraft # requires snapcraft >= 4.8
+
+# move the built snap to output
+mv *.snap /opt/output/
+chown ${CURRENT_UID}:${CURRENT_GID} /opt/output/*.snap
diff --git a/extras/packaging/gnu-linux/scripts/deploy-packages.sh b/extras/packaging/gnu-linux/scripts/deploy-packages.sh
new file mode 100755
index 000000000..10c356d0b
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/deploy-packages.sh
@@ -0,0 +1,332 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2016-2021 Savoir-faire Linux Inc.
+#
+# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
+# Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+#
+# This script syncs and deploys packages ./extras/packaging/gnu-linux/from packages/distro.
+# It should be run from the project root directory.
+#
+# Requirements
+# - createrepo-c
+# - dpkg
+# - reprepro
+# - rpm
+# - rsync
+# - snapcraft
+
+# Exit immediately if a command exits with a non-zero status
+set -e
+
+###############################
+## Debian / Ubuntu packaging ##
+###############################
+
+function package_deb()
+{
+    DISTRIBUTION_REPOSITORY_FOLDER=$(realpath repositories)/${DISTRIBUTION}
+    mkdir -p ${DISTRIBUTION_REPOSITORY_FOLDER}
+
+    ##################################################
+    ## Create local repository for the given distro ##
+    ##################################################
+    echo "#########################"
+    echo "## Creating repository ##"
+    echo "#########################"
+
+    mkdir ${DISTRIBUTION_REPOSITORY_FOLDER}/conf
+
+    # Distributions file
+    cat << EOF > ${DISTRIBUTION_REPOSITORY_FOLDER}/conf/distributions
+Origin: jami
+Label: Jami ${DISTRIBUTION} Repository
+Codename: jami
+Architectures: i386 amd64 armhf arm64
+Components: main
+Description: This repository contains Jami ${DISTRIBUTION} packages
+SignWith: ${KEYID}
+
+# TODO: Remove when April 2024 comes.
+Origin: ring
+Label: Ring ${DISTRIBUTION} Repository
+Codename: ring
+Architectures: i386 amd64 armhf arm64
+Components: main
+Description: This repository contains Ring ${DISTRIBUTION} packages
+SignWith: ${KEYID}
+EOF
+
+    ####################################
+    ## Add packages to the repository ##
+    ####################################
+    # Note: reprepro currently only accepts .deb files as input, but
+    # Ubuntu generates their debug symbol packages as .ddeb (see:
+    # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=730572).  As
+    # these are just regular Debian packages, simply append the .deb
+    # extension to their file name to work around this.
+    find ./extras/packaging/gnu-linux/packages -type f -name '*.ddeb' -print0 | xargs -0 -I{} mv {} {}.deb
+
+    for package in ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.deb; do
+        echo "## signing: ${package} ##"
+        dpkg-sig -k ${KEYID} --sign builder ${package}
+
+        echo "## including ${package} ##"
+        package_name=$(dpkg -I ${package} | grep -m 1 Package: | awk '{print $2}')
+        package_arch=$(dpkg -I ${package} | grep -m 1 Architecture: | awk '{print $2}')
+
+        if [ ${package_arch} = "all" ]; then
+            # Removing to avoid the error of adding the same deb twice.
+            # This happens with arch all packages, which are generated in amd64 and i386.
+            reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} remove jami ${package_name}
+            # TODO: Remove when April 2024 comes.
+            reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} remove ring ${package_name}
+        fi
+        reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} includedeb jami ${package}
+        # TODO: Remove when April 2024 comes.
+        reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} includedeb ring ${package}
+    done
+
+    # Rebuild the index
+    reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} export jami
+    # TODO: Remove when April 2024 comes.
+    reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} export ring
+
+    # Show the contents
+    reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} list jami
+    # TODO: Remove when April 2024 comes.
+    reprepro --verbose --basedir ${DISTRIBUTION_REPOSITORY_FOLDER} list ring
+
+    #######################################
+    ## create the manual download folder ##
+    #######################################
+    NAME_PATTERN=jami-all_????????.*\~dfsg*.deb
+    if ls ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}/${NAME_PATTERN} &> /dev/null; then
+        DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER=$(realpath manual-download)/${DISTRIBUTION}
+        mkdir -p ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}
+        cp ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}/${NAME_PATTERN} ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}
+        for package in ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}/${NAME_PATTERN} ; do
+            package_name=$(dpkg -I ${package} | grep -m 1 Package: | awk '{print $2}')
+            package_arch=$(dpkg -I ${package} | grep -m 1 Architecture: | awk '{print $2}')
+            package_shortname=${package_name}_${package_arch}.deb
+            rm -f ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}/${package_shortname}
+            cp ${package} ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}/${package_shortname}
+        done
+    fi
+}
+
+
+######################
+## Fedora packaging ##
+######################
+
+function package_rpm()
+{
+    ##################################################
+    ## Create local repository for the given distro ##
+    ##################################################
+    echo "#########################"
+    echo "## Creating repository ##"
+    echo "#########################"
+
+    local name
+    local baseurl
+
+    DISTRIBUTION_REPOSITORY_FOLDER=$(realpath repositories)/${DISTRIBUTION}
+    mkdir -p ${DISTRIBUTION_REPOSITORY_FOLDER}
+
+    # .repo file
+    name="${DISTRIBUTION%_*} \$releasever - \$basearch - jami"
+    baseurl="https://dl.jami.net/${CHANNEL}/${DISTRIBUTION%_*}_\$releasever"
+
+    cat << EOF > ${DISTRIBUTION_REPOSITORY_FOLDER}/jami-${CHANNEL}.repo
+[jami]
+name=$name
+baseurl=$baseurl
+gpgcheck=1
+gpgkey=https://dl.jami.net/jami.pub.key
+enabled=1
+EOF
+
+    ####################################
+    ## Add packages to the repository ##
+    ####################################
+
+    # Sign the rpms
+    echo "##################"
+    echo "## signing rpms ##"
+    echo "##################"
+
+    # RPM macros
+    if [ ! -f ~/.rpmmacros ];
+    then
+        echo "%_signature gpg" > ~/.rpmmacros
+        echo "%_gpg_name ${KEYID}" >> ~/.rpmmacros
+    fi
+
+    for package in ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.rpm; do
+        rpmsign --resign --key-id=${KEYID} ${package}
+        cp ${package} ${DISTRIBUTION_REPOSITORY_FOLDER}
+    done
+
+    # Create the repo
+    createrepo_c --update ${DISTRIBUTION_REPOSITORY_FOLDER}
+
+    #######################################
+    ## create the manual download folder ##
+    #######################################
+    local packages
+
+    DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER=$(realpath manual-download)/${DISTRIBUTION}
+    mkdir -p ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}
+
+    if [ -d "./extras/packaging/gnu-linux/packages/${DISTRIBUTION}/one-click-install/" ]; then
+        packages=(./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/one-click-install/*.rpm)
+    else
+        packages=(./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.rpm)
+    fi
+
+    for package in "${packages[@]}"; do
+        cp ${package} ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}
+        package_name=$(rpm -qp --queryformat '%{NAME}' ${package})
+        package_arch=$(rpm -qp --queryformat '%{ARCH}' ${package})
+        cp ${package} ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER}/${package_name}_${package_arch}.rpm
+    done
+}
+
+
+####################
+## Snap packaging ##
+####################
+
+function package_snap()
+{
+    echo "####################"
+    echo "## deploying snap ##"
+    echo "####################"
+
+    if [[ "${CHANNEL:0:8}" == "internal" ]]; then
+        DISTRIBUTION_REPOSITORY_FOLDER=$(realpath repositories)/${DISTRIBUTION}
+        mkdir -p ${DISTRIBUTION_REPOSITORY_FOLDER}
+        ls ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*
+        cp ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.snap ${DISTRIBUTION_REPOSITORY_FOLDER}/
+    elif [[ $CHANNEL =~ nightly ]]; then
+        echo $(hostname)
+        echo $(whoami)
+        echo $(snapcraft whoami)
+        snapcraft push ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.snap --release edge
+    elif [[ $CHANNEL =~ stable ]]; then
+        snapcraft push ./extras/packaging/gnu-linux/packages/${DISTRIBUTION}*/*.snap --release stable
+    fi
+}
+
+
+################################################
+## Deploy packages on given remote repository ##
+################################################
+
+function deploy()
+{
+    if [ -f "${SSH_IDENTITY_FILE}" ];
+    then
+        export RSYNC_RSH="ssh -i ${SSH_IDENTITY_FILE}"
+    fi
+
+    echo "##########################"
+    echo "## deploying repository ##"
+    echo "##########################"
+    echo "Using RSYNC_RSH='${RSYNC_RSH}'"
+    rsync --archive --recursive --verbose \
+          --delete ${DISTRIBUTION_REPOSITORY_FOLDER} \
+          ${REMOTE_REPOSITORY_LOCATION}
+
+    echo "#####################################"
+    echo "## deploying manual download files ##"
+    echo "#####################################"
+    rsync --archive --recursive --verbose \
+          --delete ${DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER} \
+          ${REMOTE_MANUAL_DOWNLOAD_LOCATION}
+}
+
+
+##########################################################
+## Detect suitable packaging based on distribution name ##
+##########################################################
+
+function package()
+{
+    if [[ $DISTRIBUTION =~ debian|ubuntu|raspbian|guix-deb-pack ]]; then
+        package_deb
+    elif [[ $DISTRIBUTION =~ fedora|rhel|opensuse ]]; then
+        package_rpm
+    elif [[ $DISTRIBUTION =~ snap ]]; then
+        package_snap
+    else
+        echo "error: Distribution \"$DISTRIBUTION\" is not supported"
+    fi
+}
+
+function remove-deployed-files()
+{
+    # remove deployed files
+    rm -rf manual-download
+    rm -rf repositories
+    rm -rf ${DISTRIBUTION_REPOSITORY_FOLDER}
+}
+
+for i in "$@"
+do
+case $i in
+    --distribution=*)
+    DISTRIBUTION="${i#*=}"
+    shift
+    ;;
+    --keyid=*)
+    KEYID="${i#*=}"
+    shift
+    ;;
+    --remote-repository-location=*)
+    REMOTE_REPOSITORY_LOCATION="${i#*=}"
+    shift
+    ;;
+    --remote-manual-download-location=*)
+    REMOTE_MANUAL_DOWNLOAD_LOCATION="${i#*=}"
+    shift
+    ;;
+    --remote-ssh-identity-file=*)
+    SSH_IDENTITY_FILE="${i#*=}"
+    shift
+    ;;
+    *)
+    echo "Unrecognized option ${i}"
+    exit 1
+    ;;
+esac
+done
+
+
+if [ -z "${KEYID}" ];
+then
+    DISTRIBUTION_REPOSITORY_FOLDER=$(realpath repositories)/${DISTRIBUTION}
+    DISTRIBUTION_MANUAL_DOWNLOAD_FOLDER=$(realpath manual-download)/${DISTRIBUTION}
+    deploy
+    remove-deployed-files
+else
+    package
+    deploy
+fi
diff --git a/extras/packaging/gnu-linux/scripts/install-cmake.sh b/extras/packaging/gnu-linux/scripts/install-cmake.sh
new file mode 100755
index 000000000..db868a917
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/install-cmake.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+set -e
+
+if command -v apt-get &> /dev/null
+then
+    apt-get remove cmake cmake-data -y
+fi
+
+wget https://github.com/Kitware/CMake/releases/download/v3.19.8/cmake-3.19.8-Linux-x86_64.sh \
+      -q -O /tmp/cmake-install.sh
+echo "aa5a0e0dd5594b7fd7c107a001a2bfb5f83d9b5d89cf4acabf423c5d977863ad  /tmp/cmake-install.sh" | sha256sum --check 
+chmod u+x /tmp/cmake-install.sh
+/tmp/cmake-install.sh --skip-license --prefix=/usr/local/
+rm /tmp/cmake-install.sh
\ No newline at end of file
diff --git a/extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh b/extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh
new file mode 100755
index 000000000..ba0bce80f
--- /dev/null
+++ b/extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2021 Savoir-faire Linux Inc.
+#
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script is used in the packaging containers to build packages on
+# debian-based distros.
+
+set -e
+
+DPKG_BUILD_OPTIONS=""
+# Set the host architecture as armhf and add some specific architecture
+# options to the package builder.
+if grep -q "raspbian_10_armhf" <<< "${DISTRIBUTION}"; then
+    echo "Adding armhf as the host architecture."
+    export HOST_ARCH=arm-linux-gnueabihf
+    DPKG_BUILD_OPTIONS="${DPKG_BUILD_OPTIONS} -a armhf"
+fi
+
+install_deps()
+{
+    apt-get update
+    mk-build-deps \
+        --remove --install \
+        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
+        "debian/control"
+}
+
+install_dummy()
+{
+    cat <<EOF > dummy-libqt-jami.equivs
+Package: libqt-jami
+Version: 1.0
+Maintainer: The Jami project <jami@gnu.org>
+Architecture: all
+Description: Dummy libqt-jami package
+EOF
+    equivs-build dummy-libqt-jami.equivs
+    dpkg -i libqt-jami_1.0_all.deb
+}
+
+remove_dummy()
+{
+    dpkg -r libqt-jami
+}
+
+case "$1" in
+    qt-deps)
+        (
+            cd /tmp/builddeps
+            install_deps
+            dpkg -r libqt-jami-build-deps
+        )
+        rm -rf /tmp/builddeps
+        exit 0
+        ;;
+    jami-deps)
+        (
+            cd /tmp/builddeps
+            install_dummy
+            install_deps
+            dpkg -r jami-build-deps
+            remove_dummy
+        )
+        rm -rf /tmp/builddeps
+        exit 0
+        ;;
+    *)
+        printf "Usage: %s {qt-deps|jami-deps}\n" "$0"
+        exit 1
+        ;;
+esac
diff --git a/extras/packaging/gnu-linux/tarballs.manifest b/extras/packaging/gnu-linux/tarballs.manifest
new file mode 100644
index 000000000..b3e813177
--- /dev/null
+++ b/extras/packaging/gnu-linux/tarballs.manifest
@@ -0,0 +1,16 @@
+/home/amarok/Projects/jami/daemon/contrib/tarballs/asio-asio-1-22-1.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/ffmpeg-n5.0.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/ffnvcodec-n11.1.5.1.tar.xz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/fmt-9.1.0.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/gmp-6.2.1.tar.bz2
+/home/amarok/Projects/jami/daemon/contrib/tarballs/http-parser-2.9.4.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/libarchive-3.6.0.tar.xz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/libgit2-v1.1.0.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/libnatpmp-20150609.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/opendht-af7d88b057fa4c84ab9096c6a1932bd5d34634ef.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/pjproject-513a3f14c44b2c2652f9219ec20dea64b236b713.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/restinio-bbaa034dbcc7555ce67df0f8a1475591a7441733.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/secp256k1-0b7024185045a49a1a6a4c5615bf31c94f63d9c4.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/pupnp-release-1.14.13.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/libvpx-v1.12.0.tar.gz
+/home/amarok/Projects/jami/daemon/contrib/tarballs/webrtc-audio-processing-v0.3.1.tar.gz
-- 
GitLab