Welcome back to this multi-part tutorial in how to create xdg-app applications. In part 1 we installed everything we needed and manually created our first application. In this part we will build a more complex application, using the basic xdg-app tools.
I chose to build the gnome dictionary application, because its a small app with no dependencies. To build it we use the SDK (software development kit) that matches the runtime we used in the previous part. The SDK contains the development toolchain and the headers needed to build applications using the libraries in the runtime.
First we need to install the SDK. This is rather large, so it may take a while:
xdg-app --user install gnome org.gnome.Sdk 3.20
We also want the sources to the application we want to build:
wget https://download.gnome.org/sources/gnome-dictionary/3.20/gnome-dictionary-3.20.0.tar.xz
Just like last time we start by creating the application directory where the application will be installed. However, this time we use the build-init command to create it:
xdg-app build-init appdir2 org.gnome.Dictionary org.gnome.Sdk org.gnome.Platform 3.20
This creates a directory called “appdir2” with a metadata file and the right directory structure. The only difference from last time is that the metadata file specifies a sdk as well as a runtime. A sdk is really just a runtime, but it is used during the build phase, rather than when the user runs the app.
Now that we have specified a sdk we can use the xdg-app build command. This is very similar to the run command, except it operates on an application build directory rather than an installed application, and it uses the sdk instead of the regular runtime. It also gives the sandbox access to all your files. For example, you can run:
$ xdg-app build appdir2 touch /app/some_file $ xdg-app build appdir2 ls -l /app total 0 -rw-r--r-- 1 alex wheel 0 Feb 19 16:03 some_file
This will have created a file “appdir2/files/some_file” in your tutorial directory.
Using this command you can build the application like you normally would, except in a sandbox. Since it is in a sandbox it will automatically use the compiler and other tools from the sdk. gnome-dictionary builds fine with a traditional configure; make; make install; incantation, so we only have to add a xdg-app prefix to these:
tar xvf gnome-dictionary-3.20.0.tar.xz cd gnome-dictionary-3.20.0/ xdg-app build ../appdir2 ./configure --prefix=/app xdg-app build ../appdir2 make xdg-app build ../appdir2 make install cd ..
We also need to give the app access to X11 and the network, and specify the command that is used to start the app. This is done with the build-finish operation:
xdg-app build-finish appdir2 --socket=x11 --share=network --command=gnome-dictionary
This adds some extra info to the metadata file, and creates the exports directory, which we’ll come back to later. You can install and try the app by running
xdg-app build-export repo appdir2 xdg-app --user install tutorial-repo org.gnome.Dictionary xdg-app run org.gnome.Dictionary
You will see some warnings because we didn’t grant the app access to the dconf database, but other than that everything works.
On interesting new thing here is the exports mentioned above. If you look into the appdir2/export/ directory you will find this structure:
appdir2/export └── share ├── applications │ └── org.gnome.Dictionary.desktop └── dbus-1 └── services └── org.gnome.Dictionary.service
And when the app is installed, these files will be exported into ~/.local/share/xdg-app/exports/. The xdg-app package then sets the XDG_DATA_DIRS environment variable to point to this directory, which means your desktop environment will look in it. This sounds a bit complicated, but what it means is that once the app is installed it will automatically appear among the normal applications in your desktop environment.
There is one limit on what gets exported though. All the filesnames (not directory names) must have the application id as a prefix. This works in the above setup because the desktop file is org.gnome.Dictionary.desktop, which is what we used for the id. This limitation guarantees that applications cannot cause conflicts, and that they can’t override any system installed applications.
We have now built a simple application with no dependencies. If there are any dependencies that are not in the runtime you need to build those too. This means more cycles of configure; make; make install; While this is not hard, it is a lot of manual repeated work. In the next part of this series we will see how this can be automated using the xdg-app-builder tool.
Is xdg-app in a state that can replace the use of distro-specific packages?