Flatpak
Flatpak (former xdg-app) is a package management system to distribute desktop applications for Linux. It is based on OSTree.
Flatpak is RedHat initiative.
Unlike AppImage, usually applications are distributed via flathub store, and require a special runtime to install applications on target machines.
The major advantage of Flatpak is sandboxing: each application runs in its own isolated environment. Flatpak provides fine-grained control to system resources
(e.g. network, bluetooth, host filesystem, etc.). Flatpak also offers a set of runtimes for various Linux desktop applications, e.g.
Freedesktop, GNOME and KDE.
The packaging process is:
Install the flatpak runtime, flatpak-builder and SDK.
Create a manifest
<app-id>.jsonRun the
flatpak-builderin order to produce the applicationPublish the application for further distribution
With help of conan’s json generator, the manifest creation could be easily automated. For example, the custom script could generate build-commands and sources entries within the manifest file:
app_id = "org.flatpak.%s" % self._name
manifest = {
"app-id": app_id,
"runtime": "org.freedesktop.Platform",
"runtime-version": "18.08",
"sdk": "org.freedesktop.Sdk",
"command": "conan-entrypoint.sh",
"modules": [
{
"name": self._name,
"buildsystem": "simple",
"build-commands": ["install -D conan-entrypoint.sh /app/bin/conan-entrypoint.sh"],
"sources": [
{
"type": "file",
"path": "conan-entrypoint.sh"
}
]
}
]
}
sources = []
build_commands = []
for root, _, filenames in os.walk(temp_folder):
for filename in filenames:
filepath = os.path.join(root, filename)
unique_name = str(uuid.uuid4())
source = {
"type": "file",
"path": filepath,
"dest-filename": unique_name
}
build_command = "install -D %s /app/%s" % (unique_name, os.path.relpath(filepath, temp_folder))
sources.append(source)
build_commands.append(build_command)
manifest["modules"][0]["sources"].extend(sources)
manifest["modules"][0]["build-commands"].extend(build_commands)
Alternatively, flatpak allows distributing the single-file package. Such package, however, cannot be run or installed on its own, it’s needed to be imported to the local repository on another machine.