Search code examples
appimage

How to make AppDir files available to an AppImage application?


My build system, which uses meson, puts some files my application needs on AppDir under AppDir/usr/share/myapp/resources. The application needs both, read and write to those files when it is running. The files are in AppDir when I look at it, but when the .AppImage is generated, the standalone running executable cannot access those files. When integrating the application with the desktop, the application gets installed in ~/Applications, but it doesn't contain those files.

Here is a visualization of how it looks when the application is installed on the system without using AppImage (ninja install)

🗀 usr
   🗀 share
        🗀 myapp
            🗀 resources
                🖹 MainWindow.glade
                🖹 dataCache.json

When I do DESTDIR=AppDir ninja install the structure ends like this

🗀 AppDir
    🗀 usr
        🗀 share
            🗀 myapp
                🗀 resources
                    🖹 MainWindow.glade
                    🖹 dataCache.json

When the application (MyApp.AppImage) is integrated into the user's desktop with AppImageLauncher, it only copies the AppImage into the Applications directory. There are no other folders or files.

Edit: I am using ./linuxdeploy-x86_64.AppImage --appdir AppDir to create the directory AppDir. Then I use DESTDIR=AppDir ninja install to install the app to AppDir, and then I use ./linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage to create the AppImage

How would one go to access those files that were in AppDir once the app is bundled? Or how does one make the app integration copy those files to the Applications folder so that the application can have access to them while the application is running?


Solution

  • To resolve the AppImage mount point at runtime you can use the APPDIR environment variable. For example, if you want to resolve usr/share/icons/hicolor/myicon.png you need to use the following path $APPDIR/usr/share/icons/hicolor/myicon.png.

    It's recommended that you modify the application to be able to resolve its resources depending on the binary location. As an alternative, you can use a custom environment variable to set up the path or a configuration file next to your main binary.

    Regarding writing files inside the AppImage. This is not possible by design. An AppImage is a read-only SquashFS image that is mounted at runtime. Any application data should be written to $HOME/.config or $HOME/.local/share depending on whether it's a configuration data or other kind of data. The recommended workflow is to copy such data on the first run.

    For more information about whether to copy your application data see https://www.freedesktop.org/wiki/Software/xdg-user-dirs/