anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / applications / networking / instant-messengers / signal-desktop / generic.nix
blob98b056bedd3b4b721fc86e066b9d624afbfeb369
1 { stdenv
2 , lib
3 , callPackage
4 , fetchurl
5 , autoPatchelfHook
6 , noto-fonts-color-emoji
7 , dpkg
8 , asar
9 , rsync
10 , python3
11 , buildPackages
12 , nixosTests
13 , gtk3
14 , atk
15 , at-spi2-atk
16 , cairo
17 , pango
18 , pipewire
19 , gdk-pixbuf
20 , glib
21 , freetype
22 , fontconfig
23 , dbus
24 , libX11
25 , xorg
26 , libXi
27 , libXcursor
28 , libXdamage
29 , libXrandr
30 , libXcomposite
31 , libXext
32 , libXfixes
33 , libXrender
34 , libXtst
35 , libXScrnSaver
36 , nss
37 , nspr
38 , alsa-lib
39 , cups
40 , expat
41 , libuuid
42 , at-spi2-core
43 , libappindicator-gtk3
44 , mesa
45   # Runtime dependencies:
46 , systemd
47 , libnotify
48 , libdbusmenu
49 , libpulseaudio
50 , xdg-utils
51 , wayland
54 { pname
55 , dir
56 , version
57 , hash
58 , url
61 let
62   inherit (stdenv) targetPlatform;
63   ARCH = if targetPlatform.isAarch64 then "arm64" else "x64";
65   # Noto Color Emoji PNG files for emoji replacement; see below.
66   noto-fonts-color-emoji-png = noto-fonts-color-emoji.overrideAttrs (prevAttrs: {
67     pname = "noto-fonts-color-emoji-png";
69     # The build produces 136×128 PNGs by default for arcane font
70     # reasons, but we want square PNGs.
71     buildFlags = prevAttrs.buildFlags or [ ] ++ [ "BODY_DIMENSIONS=128x128" ];
73     makeTargets = [ "compressed" ];
75     installPhase = ''
76       runHook preInstall
78       mkdir -p $out/share
79       mv build/compressed_pngs $out/share/noto-fonts-color-emoji-png
80       python3 add_aliases.py --srcdir=$out/share/noto-fonts-color-emoji-png
82       runHook postInstall
83     '';
84   });
86 stdenv.mkDerivation rec {
87   inherit pname version;
89   # Please backport all updates to the stable channel.
90   # All releases have a limited lifetime and "expire" 90 days after the release.
91   # When releases "expire" the application becomes unusable until an update is
92   # applied. The expiration date for the current release can be extracted with:
93   # $ grep -a "^{\"buildExpiration" "${signal-desktop}/lib/${dir}/resources/app.asar"
94   # (Alternatively we could try to patch the asar archive, but that requires a
95   # few additional steps and might not be the best idea.)
97   src = fetchurl {
98     inherit url hash;
99     recursiveHash = true;
100     downloadToTemp = true;
101     nativeBuildInputs = [ dpkg asar ];
102     # Signal ships the Apple emoji set without a licence via an npm
103     # package and upstream does not seem terribly interested in fixing
104     # this; see:
105     #
106     # * <https://github.com/signalapp/Signal-Android/issues/5862>
107     # * <https://whispersystems.discoursehosting.net/t/signal-is-likely-violating-apple-license-terms-by-using-apple-emoji-in-the-sticker-creator-and-android-and-desktop-apps/52883>
108     #
109     # We work around this by replacing it with the Noto Color Emoji
110     # set, which is available under a FOSS licence and more likely to
111     # be used on a NixOS machine anyway. The Apple emoji are removed
112     # during `fetchurl` to ensure that the build doesn’t cache the
113     # unlicensed emoji files, but the rest of the work is done in the
114     # main derivation.
115     postFetch = ''
116       dpkg-deb -x $downloadedFile $out
117       asar extract "$out/opt/${dir}/resources/app.asar" $out/asar-contents
118       rm -r \
119         "$out/opt/${dir}/resources/app.asar"{,.unpacked} \
120         $out/asar-contents/node_modules/emoji-datasource-apple
121     '';
122   };
124   nativeBuildInputs = [
125     rsync
126     asar
127     python3
128     autoPatchelfHook
129     # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651
130     # Has to use `makeShellWrapper` from `buildPackages` even though `makeShellWrapper` from the inputs is spliced because `propagatedBuildInputs` would pick the wrong one because of a different offset.
131     (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; })
132   ];
134   buildInputs = [
135     alsa-lib
136     at-spi2-atk
137     at-spi2-core
138     atk
139     cairo
140     cups
141     dbus
142     expat
143     fontconfig
144     freetype
145     gdk-pixbuf
146     glib
147     gtk3
148     libX11
149     libXScrnSaver
150     libXcomposite
151     libXcursor
152     libXdamage
153     libXext
154     libXfixes
155     libXi
156     libXrandr
157     libXrender
158     libXtst
159     libappindicator-gtk3
160     libpulseaudio
161     libnotify
162     libuuid
163     mesa # for libgbm
164     nspr
165     nss
166     pango
167     systemd
168     xorg.libxcb
169     xorg.libxshmfence
170   ];
172   runtimeDependencies = [
173     (lib.getLib systemd)
174     libappindicator-gtk3
175     libnotify
176     libdbusmenu
177     pipewire
178     xdg-utils
179     wayland
180   ];
182   dontBuild = true;
183   dontConfigure = true;
185   unpackPhase = ''
186     rsync -a --chmod=+w $src/ .
187   '';
189   installPhase = ''
190     runHook preInstall
192     mkdir -p $out/lib
194     mv usr/share $out/share
195     mv "opt/${dir}" "$out/lib/${dir}"
197     # Symlink to bin
198     mkdir -p $out/bin
199     ln -s "$out/lib/${dir}/${pname}" $out/bin/${pname}
201     # Create required symlinks:
202     ln -s libGLESv2.so "$out/lib/${dir}/libGLESv2.so.2"
204     # Copy the Noto Color Emoji PNGs into the ASAR contents. See `src`
205     # for the motivation, and the script for the technical details.
206     emojiPrefix=$(
207       python3 ${./copy-noto-emoji.py} \
208       ${noto-fonts-color-emoji-png}/share/noto-fonts-color-emoji-png \
209       asar-contents
210     )
212     # Replace the URL used for fetching large versions of emoji with
213     # the local path to our copied PNGs.
214     substituteInPlace asar-contents/preload.bundle.js \
215       --replace-fail \
216         'emoji://jumbo?emoji=' \
217         "file://$out/lib/${lib.escapeURL dir}/resources/app.asar/$emojiPrefix/"
219     # `asar(1)` copies files from the corresponding `.unpacked`
220     # directory when extracting, and will put them back in the modified
221     # archive if you don’t specify them again when repacking. Signal
222     # leaves their native `.node` libraries unpacked, so we match that.
223     asar pack \
224       --unpack '*.node' \
225       asar-contents \
226       "$out/lib/${dir}/resources/app.asar"
228     runHook postInstall
229   '';
231   preFixup = ''
232     gappsWrapperArgs+=(
233       --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
234       --suffix PATH : ${lib.makeBinPath [ xdg-utils ]}
235     )
237     # Fix the desktop link
238     substituteInPlace $out/share/applications/${pname}.desktop \
239       --replace-fail "/opt/${dir}/${pname}" $out/bin/${pname} \
240       --replace-fail "StartupWMClass=Signal" "StartupWMClass=signal"
242     # Note: The following path contains bundled libraries:
243     # $out/lib/${dir}/resources/app.asar.unpacked/node_modules/
244     patchelf --add-needed ${libpulseaudio}/lib/libpulse.so "$out/lib/${dir}/resources/app.asar.unpacked/node_modules/@signalapp/ringrtc/build/linux/libringrtc-${ARCH}.node"
245   '';
247   passthru = {
248     # Tests if the application launches and waits for "Link your phone to Signal Desktop":
249     tests.application-launch = nixosTests.signal-desktop;
250     updateScript.command = [ ./update.sh ];
251   };
253   meta = {
254     description = "Private, simple, and secure messenger";
255     longDescription = ''
256       Signal Desktop is an Electron application that links with your
257       "Signal Android" or "Signal iOS" app.
258     '';
259     homepage = "https://signal.org/";
260     changelog = "https://github.com/signalapp/Signal-Desktop/releases/tag/v${version}";
261     license = [
262       lib.licenses.agpl3Only
264       # Various npm packages
265       lib.licenses.free
266     ];
267     maintainers = with lib.maintainers; [
268       mic92
269       equirosa
270       urandom
271       bkchr
272       teutat3s
273       emily
274     ];
275     mainProgram = pname;
276     platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
277     sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
278   };