ubuntuusers.de

Wie erstellt man ein Appimage Paket?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

ubinde

Anmeldungsdatum:
10. September 2010

Beiträge: 173

Ich habe dieser Anfrage schon beim appimage forum gemacht und keiner meldet sich. Ich habe mich mit https://docs.appimage.org/packaging-guide/index.html befasst. Aber es ist zu schwierig. Mit dem dino im source code als Beispiel https://github.com/dino/dino/releases wäre du bereit Schrittweise Erklärungen und Anweisungen zu geben? Ich bin mir nicht klar ob das schaffen von einer appimage eine generische Sache ist? Wenn man einen appimage machen kann, kann man jeden appimage machen? Danke.

Moderiert von noisefloor:

Ins passende Forum verschoben, Titel aussagekräftiger gemacht

robert-engel

Anmeldungsdatum:
30. Oktober 2015

Beiträge: 2000

Hallo ubinde,

das frage ich mich auch schon eine ganze Weile. Bisher bin ich so weit gekommen, dass das AppImage ohne Fehler, nur mit Warnung erstellt wird. Allerdings ist es zu klein, d.h. es fehlen wohl die ganzen Libraries (Vermutung meinerseits). Zudem startet es nicht, obwohl es als ausführbar markiert ist.

Ich habe das am Beispiel des DoubleCommanders mal in einem Dokument (im Anhang) festgehalten. Vielleicht kommst Du ein Stück weiter.

Edit: Ich habe nach einer Anleitung noch einen Ordner /usr/lib hinzugefügt, weiß aber nicht, welche Libraries dort hinein müssen. Auf jeden Fall werden die Dateien mit ins Image einbezogen, da das AppImage wächst. Ich habe auch ein funktionierendes AppImage von DoubleCommander und das ist deutlich größer (129 MB statt 5-15 MB wie bisher bei mir).

Auf einer bekannten Videoplattform wird immer nur für sehr einfache Anwendungen vorgeführt, wie man ein AppImage erstellt. Auch die (bisher gefundenen) schriftlichen Beschreibungen sind unvollständig. Daran habe ich mich orientiert, leider nur mit dem angegebenen Ergebnis einer nicht startenden Anwendung.

Beispiel: https://www.youtube.com/watch?v=Wy63jwjpNg4

Gruß, Robert.

AppImage_erstellen.pdf (43.3 KiB)
Download AppImage_erstellen.pdf

ubinde

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 173

https://docs.appimage.org/packaging-guide/from-source/native-binaries.html#cmake Es scheint, man soll der source code mit cmake build. Danach install in AppDir folder. In home folder sind dino source code folder und dino.AppDir folder. Weiss du was man in command line schreiben soll?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

Ganz generisch ist das leider nicht - man muss eine Vorstellung davon entwickeln, was da passiert und wo man ansetzen kann, wenn etwas nicht ganz so aussieht, wie man es haben will...

Unter der Annahme, dass man das Programm Dino aus den Sourcen baut und man ~/bin/ im PATH hat:

  • Abhängigkeiten installieren

sudo apt install cmake ninja-build valac gettext libgee-0.8-dev libsqlite3-dev libgtk-3-dev libgpgme-dev libsoup2.4-dev libgcrypt20-dev libqrencode-dev libgspell-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libwebrtc-audio-processing-dev libsrtp2-dev libnice-dev glib-networking gstreamer1.0-plugins-good gstreamer1.0-gtk3 libsignal-protocol-c-dev 
  • linuxdeploy herunterladen und ausführbar machen:

wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O ~/bin/linuxdeploy-x86_64.AppImage
chmod +x ~/bin/linuxdeploy-x86_64.AppImage 
  • Anwendung bauen und - da Dino alle nötigen Dateien mitbringt - in den Unterordner Dino.AppDir des build-Verzeichnis installieren:

wget https://github.com/dino/dino/archive/refs/tags/v0.2.2.tar.gz
tar xfv v0.2.2.tar.gz 
cd dino-0.2.2/
./configure --prefix="/usr"
make
make DESTDIR=Dino.AppDir install  # das ist relativ zum ./build/ Verzeichnis 
  • linuxdeploy nutzen, um ein Appimage zu bauen:

cd build/
LD_LIBRARY_PATH=Dino.AppDir/usr/lib/ linuxdeploy-x86_64.AppImage --appdir Dino.AppDir/ --output appimage 

Leider passt die hinterlegte Auflösung der Screenshots in der Dino.AppDir/usr/share/metainfo/im.dino.Dino.appdata.xml nicht zu den von der Webseite geladenen Dateien, so dass die Validierung fehlschlägt:

[appimage/stdout] Trying to validate AppStream information with the appstream-util tool
[appimage/stdout] In case of issues, please refer to https://github.com/hughsie/appstream-glib
[appimage/stdout] /home/alexander/src/appimage/dino-0.2.2/build/Dino.AppDir/usr/share/metainfo/im.dino.Dino.appdata.xml: FEHLGESCHLAGEN:
[appimage/stdout] • attribute-invalid     : <screenshot> height (900) did not match specified (950) [https://dino.im/img/appdata/main.png]
[appimage/stdout] • attribute-invalid     : <screenshot> height (900) did not match specified (942) [https://dino.im/img/appdata/start_chat.png]
[appimage/stdout] • attribute-invalid     : <screenshot> width (1600) did not match specified (2018) [https://dino.im/img/appdata/contact_details.png]
[appimage/stdout] • attribute-invalid     : <screenshot> height (900) did not match specified (1188) [https://dino.im/img/appdata/contact_details.png]
[appimage/stdout] run_external: subprocess exited with status 1[appimage/stderr] Validierung der Dateien ist fehlgeschlagen
[appimage/stderr] Failed to validate AppStream information with appstream-util
ERROR: Failed to run plugin: appimage (exit code: 1) 

Also rücken wir die Werte in der Dino.AppDir/usr/share/metainfo/im.dino.Dino.appdata.xml gerade (Pull-Request für Upstream: dino/dino/pull/1163):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
--- ../main/data/im.dino.Dino.appdata.xml	2021-09-21 23:02:25.000000000 +0200
+++ Dino.AppDir/usr/share/metainfo/im.dino.Dino.appdata.xml	2021-12-14 10:39:11.470175716 +0100
@@ -120,13 +120,13 @@
   </description>
   <screenshots>
     <screenshot type="default">
-      <image height="900" width="1600">https://dino.im/img/appdata/main.png</image>
+      <image height="950" width="1600">https://dino.im/img/appdata/main.png</image>
     </screenshot>
     <screenshot>
-      <image height="900" width="1600">https://dino.im/img/appdata/start_chat.png</image>
+      <image height="942" width="1600">https://dino.im/img/appdata/start_chat.png</image>
     </screenshot>
     <screenshot>
-      <image height="900" width="1600">https://dino.im/img/appdata/contact_details.png</image>
+      <image height="1188" width="2018">https://dino.im/img/appdata/contact_details.png</image>
     </screenshot>
   </screenshots>
   <translation type="gettext">dino</translation>

Danach sollte

LD_LIBRARY_PATH=Dino.AppDir/usr/lib/ linuxdeploy-x86_64.AppImage --appdir Dino.AppDir/ --output appimage 

durchlaufen und die gewünschte Dino-x86_64.AppImage erstellen, die man auf seinen Zielsystemen verteilen und ausführen kann.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

Ich bin gerade darüber gestolpert, dass das unter Ubuntu 20.04 erstellte AppImage nicht unter Arch Linux will:

$ /tmp/Dino-665870c-x86_64.AppImage 
/tmp/Dino-665870c-x86_64.AppImage: symbol lookup error: /usr/lib/libgio-2.0.so.0: undefined symbol: g_module_open_full 

Das scheint dieses Problem zu sein: https://www.maoxuner.cn/post/2021/09/navicat-with-glib2-70/

Edit: das Konzept bei Appimages mit glib ist ziemlich unbefriedigend: https://docs.appimage.org/reference/best-practices.html^

Edit2: der appimage-builder, der die glib angeblich mit verpacken kann, ist wohl gerade kaputt: AppImageCrafters/appimage-builder/issues/165

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1566

Wohnort: Terra incognita

Gibt es dafür nicht dieses appimage? 😀

robert-engel

Anmeldungsdatum:
30. Oktober 2015

Beiträge: 2000

TausB schrieb:

Gibt es dafür nicht dieses appimage? 😀

Das hatte ich ja probiert. Man muss aber offenbar alle zugehörigen Dateien im AppDir-Verzeichnis unterbringen, damit ein ausführbares Programmpaket entsteht. Wenn man aber nicht weiß, welche das sind, muss man die Abhängigkeiten heraus finden. Dazu gibt es sicherlich auch Tools. Welche wären da geeignet?

Woher z.B. bekommt man die Abhängigkeiten zu obigem Beispiel dino oder zu doublecmd oder zu jedem anderen Programm? Irgendwo müssen die ja aufgelistet sein. Mal sehen ob apt-cache depends oder rdepens helfen.

re@PC:~$ apt-cache depends doublecmd
<doublecmd>
re@PC:~$ apt-cache rdepends doublecmd
<doublecmd>
re@PC:~$ sudo apt-rdepends doublecmd
Reading package lists... Done
Building dependency tree       
Reading state information... Done
doublecmd
re@PC:~$ 

Da ist man genau so schlau wie zuvor.

appimage-builder scheint etwas Anderes zu sein, ebenso wie pkg2appimage oder deb2appimage. Habe zu keiner Möglichkeit bisher eine durchgängig erklärte Reihenfolge gefunden, die funktioniert.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

TausB schrieb:

Gibt es dafür nicht dieses appimage? 😀

Das hat ebenfalls das Problem, dass es die glib nicht automatisch mit verpackt...

ubinde

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 173

sudo apt install cmake ninja-build valac gettext libgee-0.8-dev libsqlite3-dev libgtk-3-dev libgpgme-dev libsoup2.4-dev libgcrypt20-dev libqrencode-dev libgspell-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libwebrtc-audio-processing-dev libsrtp2-dev libnice-dev glib-networking gstreamer1.0-plugins-good gstreamer1.0-gtk3 libsignal-protocol-c-dev

dieser command ist da, um arch linux Kompatibilität zu erreichen? Und ist arch linux Kompatibilität nicht erforderlich, kann dieser command ausgelassen werden?

In dino source code folder ist ein configure file. Ist das nicht der file, womit appimagetool alle dependencies in der fertiggestellten appimage rein bekommt?

In welchem folder soll man sein, wenn man den cmake command durchführt? https://docs.appimage.org/packaging-guide/from-source/native-binaries.html#packaging-from-source

Ich weiss nicht welche commands ich schreiben muss?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

ubinde schrieb:

sudo apt install cmake ninja-build valac gettext libgee-0.8-dev libsqlite3-dev libgtk-3-dev libgpgme-dev libsoup2.4-dev libgcrypt20-dev libqrencode-dev libgspell-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libwebrtc-audio-processing-dev libsrtp2-dev libnice-dev glib-networking gstreamer1.0-plugins-good gstreamer1.0-gtk3 libsignal-protocol-c-dev

dieser command ist da, um arch linux Kompatibilität zu erreichen?

Nein, Arch Linux nutzt pacman als Paketmanager, nicht apt - der Befehl installiert alle Bauabhängigkeiten, die im Github-Wiki für das Dino-Projekt angegeben werden.

In dino source code folder ist ein configure file. Ist das nicht der file, womit appimagetool alle dependencies in der fertiggestellten appimage rein bekommt?

Nein, das configure-Skript ist teil des Buildsystems - das schaut nach, ob die nötigen Bibliotheken auf dem System, auf dem du das ganze bauen willst vorhandne sind.

In welchem folder soll man sein, wenn man den cmake command durchführt? https://docs.appimage.org/packaging-guide/from-source/native-binaries.html#packaging-from-source

dino bringt ein klassisches Makefile mit, das den cmake-Aufruf kapselt

Ich weiss nicht welche commands ich schreiben muss?

Ich hatte das Schritt für Schritt gepostet... - der Patch für die Screenshot-Auflösungen ist nicht mehr nötig, wenn man den aktuellen Git-Stand des Dino-Projekts statt des Source-Tarballs der getaggten Version v0.2.2. nimmt - mein Pull-Request wurde schon gemerged: dino/dino/pull/1163

ubinde

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 173

seahawk, wenn ich deine Anleitungen lese kann ich sie nicht verstehen, weil ich die commands nicht kenne oder den syntax nicht kenne. Kannst du zu documentation hinweisen, die deine commands und Vorschrittweise erklären? https://docs.appimage.org/packaging-guide/from-source/index.html ich finde das dieser documentation mir weiterhilft.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

Woran genau hängt es?

apt, wget, chmod, tar und make und das Anwenden von Patches im unified diff format (z.B. mit patch) sollten ja hoffentlich bekannt sein.

Das configure Skript ist für das Projekt spezifisch und spuckt genauso wie linuxdeploy/linuxdeploy Nutzungshinweise aus, wenn man es mit dem Argument -h startet.

Die Umgebungsvariable LD_LIBRARY_PATH wird z.B. in https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html erklärt - das Setzen dieser Variable ist notwendig, damit linuxdeploy die Shared libraries im Zielverzeichnis des make install Befehls abseits der systemweit dafür konfigurierten Verzeichnisse findet.

ubinde

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 173

Woran genau hängt es?

Ich habe falsch eingeschätzt wie schwierig es ist. Ich hatte den Eindruck appimage bauen ist eine Schematische Sache.

apt, wget, chmod, tar und make und das Anwenden von Patches im unified diff format (z.B. mit patch) sollten ja hoffentlich bekannt sein.

Mein Können ist limitiert. Die commands kenne ich. Aber nicht mit aller Nuancen. Wenn ich was compilieren möchte, gelingt es manchmal. Manchmal auch nicht.

Ich blicke nicht durch in welcher folder der command line zu welcher Zeit sein soll? Ist es egal in welcher folder, der command line ist? Wenn nicht wüsste ich gerne wann, wo?

sudo apt install cmake ninja-build valac gettext

Wenn du dieser command schreibt, habe ich nur Teilweise eine Ahnung was passiert. Ich weiss apt install holt Pakete. Das man apt install mit cmake kombinieren kann, wusste ich nicht. Könnte man den command in ein apt install and cmake command aufteilen? Commands ninja-build valac gettext kenne ich nicht.

Wenn man linuxdeploy anwendest, dann wird gemacht, was hier beschrieben wird: https://appimage-builder.readthedocs.io/en/latest/intro/overview.html

https://github.com/dino/dino/pull/1163

Geht es dar um icon size? Das hätte man auch mit einen png 256x256 icon platziert in dino.AppDir machen können?

./configure --prefix="/usr"

Dieser command verstehe ich nicht.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11233

Wohnort: München

ubinde schrieb:

Woran genau hängt es?

Ich habe falsch eingeschätzt wie schwierig es ist. Ich hatte den Eindruck appimage bauen ist eine Schematische Sache.

Im Großen und Ganzen schon:

  • Abhängigkeiten zum Bauen installieren

  • Quellcode kompilieren

  • das Kompilat und sonstige benötigte Dateien in einen Ordner installieren, aus dem man später das Appimage baut

  • ein Appimage bauen, wobei man da idealerweise will, dass einem das Programm, das das macht möglichst viel Kleinarbeit abnimmt

Das dumme ist nur, dass jeder dieser Schritte an das jeweilige Programm, das genutzte Build-System usw. adaptiert werden muss.

apt, wget, chmod, tar und make und das Anwenden von Patches im unified diff format (z.B. mit patch) sollten ja hoffentlich bekannt sein.

Mein Können ist limitiert. Die commands kenne ich. Aber nicht mit aller Nuancen.

Dafür gibt es ja Manpages und sonstige Dokumentation (notfalls den Quelltext) wo man das nachlesen kann, wenn man auf etwas stößt, das man noch nicht kennt.

Wenn ich was compilieren möchte, gelingt es manchmal. Manchmal auch nicht.

Da hilft nur Fehlermeldungen lesen und verstehen, was die bedeuten.

Ich blicke nicht durch in welcher folder der command line zu welcher Zeit sein soll?

Du kannst das ganze in einem beliebigen Ordner starten, in dem dein Benutzer alle Rechte hat. Im Zuge der Anleitung gibt es zwei Mal einen Verzeichniswechsel mit cd - einmal in das Verzeichnis, in das der Quellcode entpackt wurde und dann noch mal in das Unterverzeichnis build/, wo bei Programmen, die mit cmake als Buildsystem kompiliert werden üblicherweise das Ergebnis landet.

sudo apt install cmake ninja-build valac gettext

Wenn du dieser command schreibt, habe ich nur Teilweise eine Ahnung was passiert. Ich weiss apt install holt Pakete. Das man apt install mit cmake kombinieren kann, wusste ich nicht. Könnte man den command in ein apt install and cmake command aufteilen? Commands ninja-build valac gettext kenne ich nicht.

Das sind keine Befehle, sondern die Namen der Pakete, die installiert werden sollen.

Wenn man linuxdeploy anwendest, dann wird gemacht, was hier beschrieben wird: https://appimage-builder.readthedocs.io/en/latest/intro/overview.html

https://github.com/dino/dino/pull/1163

Geht es dar um icon size? Das hätte man auch mit einen png 256x256 icon platziert in dino.AppDir machen können?

Nein, das hat mit dem Icon für die Anwendung nichts zu tun, da geht es um die Angabe in der main/data/im.dino.Dino.appdata.xml, die mit im Source-Verzeichnis liegt. Die dort angegebenen Screenshots werden zum Bauen des Appimage von den genannten URLs heruntergeladen und die Größe dieser Bilder passt(e) nicht zu den Angaben in der Datei, weshalb die Validierung fehl schlägt, die das im linuxdeploy-Appimage enthaltene Programm appimage standardmäßig vornimmt.

./configure --prefix="/usr"

Dieser command verstehe ich nicht.

Der ruft das Skript configure im aktuellen Arbeitsverzeichnis (was im Kontext der von mir geposteten Anleitung das Verzeichnis ist, in das man den Quellcode aus dem Archiv entpackt hat) mit dem Argument --prefix="/usr" auf. Das ist nötig, damit später beim make install Befehl die Dateien in usr/ statt usr/local des angegebenen DESTDIR landen.

ubinde

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 173

seahawk, wenn du noch dabei bist. Können wir das ganze anders angehen? Statt du schreibt was zu machen ist. Schreibe ich was ich plane. Und du kannst dann kommentieren. Wenn wie ich es machen möchte umständlicher ist, bevorzuge ich das.

Ich habe

sudo apt install cmake ninja-build valac gettext libgee-0.8-dev libsqlite3-dev libgtk-3-dev libgpgme-dev libsoup2.4-dev libgcrypt20-dev libqrencode-dev libgspell-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libwebrtc-audio-processing-dev libsrtp2-dev libnice-dev glib-networking gstreamer1.0-plugins-good gstreamer1.0-gtk3 libsignal-protocol-c-dev

durchgeführt.

Ich habe downloadet linuxdeploy-x86_64.AppImage und marked allow execute file as program.

Ich habe downloadet dino-master.zip und extracted. Umbenannt in dino und in home folder platziert. Dann habe ich in home folder einen folder namens dino.AppDir kreiert. In dem den folder usr kreiert. In dem den folder bin kreiert. Kann ich im dino.AppDir einen 256 x 256 dino.png icon platzieren?

Stat ein build folder zu benutzen, kann man dann einen bin folder benutzen? Das heisst dino.AppDir/usr/bin.

Soll ich jetzt den Inhalt vom dino folder in folder dino.AppDir/usr/bin kopieren? Dann cd in dino.AppDir/usr/bin? Dann command line make

Es geht darum, das ich beim jeder Schritt weniger machen möchte. Dafür mehrere Schritte.

Antworten |