Appimage: Difference between revisions

imported>Chrillefkr
Adds information about why AppImages can't natively run on NixOS
Run: Improve start command py showing path instead of cryptic $AppImageFile
 
(18 intermediate revisions by 8 users not shown)
Line 1: Line 1:
<languages/>
<translate>
<!--T:1-->
[https://appimage.org/ AppImage] is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.
[https://appimage.org/ AppImage] is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.


On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain libraries commonly found on other Linux distributions to exist on certain paths; such as <code>/lib64/ld-linux-x86-64.so.2</code>.
== Usage == <!--T:10-->


== Running an AppImage file on NixOS ==
=== Run === <!--T:2-->


<!--T:3-->
On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain system libraries in hardcoded paths.
</translate>
<syntaxhighlight lang="shell">
<syntaxhighlight lang="shell">
$ nix-shell -p appimage-run
$ nix-shell -p appimage-run
$ appimage-run $AppImageFile
$ appimage-run path/to/application.AppImage
</syntaxhighlight>
</syntaxhighlight>
<translate>
=== Packaging === <!--T:8-->
<!--T:9-->
See the [https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as Nix build dependencies.
Following example is a derivation for the program Quba, which is also distributed as AppImage.
</translate>
<syntaxhighlight lang="nix">
{
  lib,
  appimageTools,
  fetchurl,
}:


== Register AppImage files as a binary type to binfmt_misc ==
let
  version = "1.4.0";
  pname = "quba";


You can tell the Linux kernel to use an interpreter (e.g. <code>appimage-run</code>) when executing certain binary files through the use of [https://en.wikipedia.org/wiki/Binfmt_misc#External_links binfmt_misc], either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with <code>appimage-run</code> as interpreter.
  src = fetchurl {
    url = "https://github.com/ZUGFeRD/quba-viewer/releases/download/v${version}/Quba-${version}.AppImage";
    hash = "sha256-EsTF7W1np5qbQQh3pdqsFe32olvGK3AowGWjqHPEfoM=";
  };


<syntaxhighlight lang="nix">
  appimageContents = appimageTools.extractType1 { inherit name src; };
boot.binfmt.registrations.appimage = {
in
   wrapInterpreterInShell = false;
appimageTools.wrapType2 rec {
   interpreter = "${pkgs.appimage-run}/bin/appimage-run";
   inherit pname version src;
  recognitionType = "magic";
 
  offset = 0;
   extraInstallCommands = ''
  mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff'';
    substituteInPlace $out/share/applications/${pname}.desktop \
   magicOrExtension = ''\x7fELF....AI\x02'';
      --replace-fail 'Exec=AppRun' 'Exec=${meta.mainProgram}'
  '';
 
  meta = {
    description = "Viewer for electronic invoices";
    homepage = "https://github.com/ZUGFeRD/quba-viewer";
    downloadPage = "https://github.com/ZUGFeRD/quba-viewer/releases";
    license = lib.licenses.asl20;
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    maintainers = with lib.maintainers; [ onny ];
    platforms = [ "x86_64-linux" ];
   };
}
</syntaxhighlight>
 
<translate>
 
== Configuration == <!--T:16-->
 
=== Register AppImage files as a binary type to binfmt_misc === <!--T:4-->
 
<!--T:5-->
You can tell the [[Linux kernel]] to use an interpreter (e.g. <code>appimage-run</code>) when executing certain binary files through the use of [https://en.wikipedia.org/wiki/Binfmt_misc#External_links binfmt_misc], either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with <code>appimage-run</code> as interpreter:
</translate>
<syntaxhighlight lang="nixos">
programs.appimage = {
  enable = true;
  binfmt = true;
};
};
</syntaxhighlight>
</syntaxhighlight>
<translate>


This way AppImage files can be invoked directly.
<!--T:7-->
 
This way AppImage files can be invoked directly as if they were normal programs
== How AppImage files are packaged by NixOS ==


See the [https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as nix build dependencies.
</translate>
[[Category:Software]]