AppImage

Linuxdeployqt: New Linux Deployment Tool for Qt


#1

Inspired by this year’s QtCon in Berlin, I have been working on Linux Deployment Tool for Qt, linuxdeployqt. These are my first steps with Qt and with C++ for that matter, and it is stil very young, but I’d appreciate your testing, comments, and (ideally) code review.

linuxdeployqt takes an application as input and makes it self-contained by copying in the Qt libraries and plugins that the application uses into a bundle. This can optionally be put into an AppImage.

This tool is conceptually based on the Mac Deployment Tool, macdeployqt in the tools applications of the Qt Toolkit, but has been changed to a slightly different logic and other tools needed for Linux.

  • Instead of an .app bundle for macOS, this produces an AppDir for Linux
  • Instead of a .dmg disk image for macOS, this produces an AppImage for Linux which is quite similar to a dmg but executes the contained application rather than just opening a window on the desktop from where the application can be launched

#2

This is fantastic, thank you for working on this. As soon as I get some time I will test this out on my Qt project and give you some feedback.


#3

Thanks. Since you definitely know about Qt and C++, I’d appreciate if you could have a look at the FIXMEs in the code too - probably not hard for someone who has some experience with it.


#4

I feel like I am getting somewhere, but still not successful.

scarlett@scarlett-neon:~/Downloads/build-skanlite-Desktop_Qt_5_7_0_GCC_64bit-Default/src$ linuxdeployqt skanlite -appimage -verbose=2
"/usr/local/bin/usr/bin:/home/scarlett/.rbenv/shims:/home/scarlett/.rbenv/bin:/home/scarlett/kde-5/bin:/home/scarlett/qt5/bin:/home/scarlett/bin:/home/scarlett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/scarlett/src/go/bin:/home/scarlett/.rvm/bin"
app-binary: “skanlite"
ERROR: FIXME: Here I would like to determine the original rpath of the main executable, but get: QSet(”$ORIGIN/lib")
Log: Deploying libraries found inside: ("./AppRun", “./lib/libicudata.so.55”, “./lib/libicuuc.so.55”, “./lib/libicui18n.so.55”)
Log: “libicui18n.so” already stripped.
Log: “libicuuc.so” already stripped.
Log: “libicudata.so” already stripped.
Log: “libicudata.so” already stripped.
Log: “libicuuc.so” already stripped.
Log: Creating AppImage for "."
Log: "./bin//appimageextract:9: GtkWarning: Unable to locate theme engine in module_path: “adwaita”,"
Log: " gtk.STOCK_OPEN, gtk.RESPONSE_OK))"
Log: "xorriso 0.5.6 : RockRidge filesystem manipulator, libburnia project."
Log: "libburn : SORRY : Unsuitable filetype for pseudo-drive"
Log: "xorriso : FAILURE : Cannot aquire drive ‘.’"
Log: "xorriso : NOTE : Tolerated problem event of severity ‘FAILURE’"
Log: "Copying of file objects from ISO image to disk filesystem is: Enabled"
Log: "xorriso : FAILURE : No ISO image present. No -dev, -indev, or -outdev selected."
Log: "xorriso : NOTE : Tolerated problem event of severity ‘FAILURE’"
Log: "xorriso : UPDATE : Thank you for being patient for 1 seconds"
Log: "Extracted from ISO image: file ‘/’=’/home/scarlett/Desktop/…AppDir’"
Log: "xorriso : NOTE : Tolerated problem event of severity ‘FAILURE’"
Log: "xorriso : NOTE : -return_with SORRY 32 triggered by problem severity FAILURE"
Log: "chown: cannot access ‘/home/scarlett/Desktop/…AppDir’: No such file or directory"
Log: "chmod: cannot access ‘/home/scarlett/Desktop/…AppDir’: No such file or directory"
Log: Created AppImage at “…AppImage”

The most visible problem is… it is searching for an AppDir on my desktop? The appimage does not actually get created. verbose 3 does show your ldd magic going on. So it is at this ISO part that the failure begins. Any ideas?
Scarlett


#5

Let’s take this in two steps: First, bundle the app without -appimage and see whether it does its thing properly (be sure to inspect the binary with ldd).

You might be running into https://github.com/probonopd/linuxdeployqt/issues/2, try setting the ENVs mentioned there prior to running linuxdeployqt (and unset them thereafter).

After you confirm this working, we will work on the AppImage part, ok?

You might also want to try -bundle-non-qt-libs: Also bundle non-core, non-Qt libraries.


#6

The tool has seen some progress in the last days. make sure you have the correct qmake of the Qt instance to be bundled on the $PATH.


#7

You have a typo in your post. Link to AppImageAssistant should be https://github.com/AppImage/AppImageKit/releases


#8

That section was outdated. AppImageAssistant is not used anymore, but the newer appimagetool. It comes as part of the linuxdeployqt*.AppImage.