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>.json
Run the
flatpak-builder
in 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.