1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
{ stdenv, libarchive, patchelf, zlib, buildFHSUserEnv, writeScript }:
rec {
# Both extraction functions could be unified, but then
# it would depend on libmagic to correctly identify ISO 9660s
extractType1 = { name, src }: stdenv.mkDerivation {
name = "${name}-extracted";
inherit src;
nativeBuildInputs = [ libarchive ];
buildCommand = ''
mkdir $out
bsdtar -x -C $out -f $src
'';
};
extractType2 = { name, src }: stdenv.mkDerivation {
name = "${name}-extracted";
inherit src;
nativeBuildInputs = [ patchelf ];
buildCommand = ''
install $src ./appimage
patchelf \
--set-interpreter ${stdenv.cc.bintools.dynamicLinker} \
--replace-needed libz.so.1 ${zlib}/lib/libz.so.1 \
./appimage
./appimage --appimage-extract
cp -rv squashfs-root $out
'';
};
wrapAppImage = args@{ name, src, extraPkgs, ... }: buildFHSUserEnv (defaultFhsEnvArgs // {
inherit name;
targetPkgs = pkgs: defaultFhsEnvArgs.targetPkgs pkgs ++ extraPkgs pkgs;
runScript = writeScript "run" ''
#!${stdenv.shell}
export APPDIR=${src}
export APPIMAGE_SILENT_INSTALL=1
cd $APPDIR
exec ./AppRun "$@"
'';
} // (removeAttrs args (builtins.attrNames (builtins.functionArgs wrapAppImage))));
wrapType1 = args@{ name, src, extraPkgs ? pkgs: [], ... }: wrapAppImage (args // {
inherit name extraPkgs;
src = extractType1 { inherit name src; };
});
wrapType2 = args@{ name, src, extraPkgs ? pkgs: [], ... }: wrapAppImage (args // {
inherit name extraPkgs;
src = extractType2 { inherit name src; };
});
defaultFhsEnvArgs = {
name = "appimage-env";
# Most of the packages were taken from the Steam chroot
targetPkgs = pkgs: with pkgs; [
gtk3
bashInteractive
gnome3.zenity
python2
xorg.xrandr
which
perl
xdg_utils
iana-etc
krb5
];
# list of libraries expected in an appimage environment:
# https://github.com/AppImage/pkg2appimage/blob/master/excludelist
multiPkgs = pkgs: with pkgs; [
desktop-file-utils
xorg.libXcomposite
xorg.libXtst
xorg.libXrandr
xorg.libXext
xorg.libX11
xorg.libXfixes
libGL
gst_all_1.gstreamer
gst_all_1.gst-plugins-ugly
libdrm
xorg.xkeyboardconfig
xorg.libpciaccess
glib
gtk2
bzip2
zlib
gdk_pixbuf
xorg.libXinerama
xorg.libXdamage
xorg.libXcursor
xorg.libXrender
xorg.libXScrnSaver
xorg.libXxf86vm
xorg.libXi
xorg.libSM
xorg.libICE
gnome2.GConf
freetype
(curl.override { gnutlsSupport = true; sslSupport = false; })
nspr
nss
fontconfig
cairo
pango
expat
dbus
cups
libcap
SDL2
libusb1
udev
dbus-glib
libav
atk
at-spi2-atk
libudev0-shim
networkmanager098
xorg.libXt
xorg.libXmu
xorg.libxcb
xorg.xcbutil
xorg.xcbutilwm
xorg.xcbutilimage
xorg.xcbutilkeysyms
xorg.xcbutilrenderutil
libGLU
libuuid
libogg
libvorbis
SDL
SDL2_image
glew110
openssl
libidn
tbb
wayland
mesa_noglu
libxkbcommon
flac
freeglut
libjpeg
libpng12
libsamplerate
libmikmod
libtheora
libtiff
pixman
speex
SDL_image
SDL_ttf
SDL_mixer
SDL2_ttf
SDL2_mixer
gstreamer
gst-plugins-base
libappindicator-gtk2
libcaca
libcanberra
libgcrypt
libvpx
librsvg
xorg.libXft
libvdpau
alsaLib
harfbuzz
e2fsprogs
libgpgerror
keyutils.lib
libjack2
fribidi
# libraries not on the upstream include list, but nevertheless expected
# by at least one appimage
libtool.lib # for Synfigstudio
];
};
}
|