stoat-desktop: build from source, darwin support

This commit is contained in:
Ross Smyth
2026-02-12 15:41:07 -05:00
parent 3cbf09a009
commit 2b2666527f
+110 -52
View File
@@ -1,72 +1,136 @@
{
stdenvNoCC,
lib,
asar,
fetchurl,
fetchzip,
stdenvNoCC,
fetchFromGitHub,
fetchPnpmDeps,
makeDesktopItem,
copyDesktopItems,
desktopToDarwinBundle,
pnpmConfigHook,
makeWrapper,
electron,
removeReferencesTo,
copyDesktopItems,
pnpm_10,
nodejs,
electron_38,
zip,
}:
stdenvNoCC.mkDerivation rec {
let
electron = electron_38;
stdenv = stdenvNoCC;
in
stdenv.mkDerivation (finalAttrs: {
pname = "stoat-desktop";
version = "1.1.12";
src = fetchzip {
url = "https://github.com/stoatchat/for-desktop/releases/download/v${version}/Stoat-linux-x64-${version}.zip";
hash = "sha256-S3uJ4ADzDgrpKVxBdEpz73Q6bqOakzk9bObaoRZopbM=";
stripRoot = false;
src = fetchFromGitHub {
owner = "stoatchat";
repo = "for-desktop";
tag = "v${finalAttrs.version}";
fetchSubmodules = true;
hash = "sha256-xyJ2yoFqMZyamvf4UEU/iUPnrQhMTFETHWQqQ91Rhpw=";
};
dontConfigure = true;
dontBuild = true;
postPatch = ''
# Disable auto-updates
substituteInPlace src/main.ts \
--replace-fail "updateElectronApp();" ""
'';
strictDeps = true;
__structuredAttrs = true;
doCheck = true;
nativeBuildInputs = [
copyDesktopItems
pnpmConfigHook
removeReferencesTo
makeWrapper
asar
copyDesktopItems
nodejs
pnpm_10
zip
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
desktopToDarwinBundle
];
installPhase = ''
runHook preInstall
set -euo pipefail
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 3;
pnpm = pnpm_10;
hash = "sha256-m0EuM8qTCFLxxO0RNze5WgMkuHZXeIi+U/Jiuv91eCg=";
};
mkdir -p "$out/bin" "$out/share/applications" "$out/share/stoat-desktop"
env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
asarPath="$(find "$src" -type f -path '*/resources/app.asar' -print -quit || true)"
if [ -z "$asarPath" ]; then
echo "ERROR: could not find resources/app.asar in $src" >&2
exit 1
fi
buildPhase = ''
runHook preBuild
resDir="$(dirname "$asarPath")"
appDir="$(dirname "$resDir")"
export npm_config_nodedir=${electron.headers}
cp -a "$resDir" "$out/share/stoat-desktop/resources"
if [ -d "$appDir/locales" ]; then
cp -a "$appDir/locales" "$out/share/stoat-desktop/locales"
fi
# override the detected electron version
substituteInPlace node_modules/@electron-forge/core-utils/dist/electron-version.js \
--replace-fail "return version" "return '${electron.version}'"
mkdir -p "$out/share/icons/hicolor/scalable/apps"
install -m644 ${
fetchurl {
url = "https://raw.githubusercontent.com/stoatchat/assets/628eb2f8255c215148007f4227d2e0d5d1a67582/desktop/icon.svg";
hash = "sha256-EMDwnAtfTZqhw8hMGTbMjZUrnVkP+2HkyHlSy6pZmik=";
}
} "$out/share/icons/hicolor/scalable/apps/stoat-desktop.svg"
# create the electron archive to be used by electron-packager
cp -r ${electron.dist} electron-dist
chmod -R u+w electron-dist
runHook postInstall
pushd electron-dist
zip -0Xqr ../electron.zip .
popd
rm -r electron-dist
# force @electron/packager to use our electron instead of downloading it
substituteInPlace node_modules/@electron/packager/dist/packager.js \
--replace-fail "await this.getElectronZipPath(downloadOpts)" "'$(pwd)/electron.zip'"
pnpm make \
--arch "${stdenv.hostPlatform.node.arch}" \
--platform "${stdenv.hostPlatform.node.platform}" \
--targets "@electron-forge/maker-zip"
runHook postBuild
'';
installPhase = lib.concatStringsSep "\n" [
"runHook preInstall"
# Make freedesktop stuff, then the convert hook should make them for Darwin
''
install -Dm444 "assets/desktop/icon.svg" "$out/share/icons/hicolor/scalable/apps/stoat-desktop.svg"
''
(lib.optionalString stdenv.hostPlatform.isLinux ''
# remove references to nodejs
find out/*/resources/app/node_modules -type f -executable -exec remove-references-to -t ${nodejs} '{}' \;
mkdir -p "$out/share/stoat-desktop"
cp -r out/*/resources{,.pak} "$out/share/stoat-desktop"
makeWrapper ${lib.getExe electron} "$out/bin/stoat-desktop" \
--add-flag $out/share/stoat-desktop/resources/app.asar \
--set ELECTRON_FORCE_IS_PACKAGED 1 \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
--inherit-argv0
'')
(lib.optionalString stdenv.hostPlatform.isDarwin ''
mkdir -p "$out/Applications"
cp -r out/*/Stoat.app
makeWrapper "$out/Applications/Stoat.app/Contents/MacOS/stoat-desktop" "$out/bin/stoat-desktop" \
--set ELECTRON_FORCE_IS_PACKAGED 1 \
--inherit-argv0
'')
"runHook postInstall"
];
desktopItems = [
(makeDesktopItem {
name = "Stoat";
exec = "stoat-desktop %u";
icon = "stoat-desktop";
exec = "${finalAttrs.meta.mainProgram} %u";
icon = "${finalAttrs.meta.mainProgram}";
desktopName = "Stoat";
genericName = meta.description;
genericName = "Chat Client";
categories = [
"Network"
"Chat"
@@ -76,24 +140,18 @@ stdenvNoCC.mkDerivation rec {
})
];
postFixup = ''
makeWrapper ${electron}/bin/electron "$out/bin/stoat-desktop" \
--add-flags "$out/share/stoat-desktop/resources/app.asar" \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform=wayland --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
'';
meta = {
description = "Open source user-first chat platform";
homepage = "https://stoat.chat/";
changelog = "https://github.com/stoatchat/for-desktop/releases/tag/v${version}";
changelog = "https://github.com/stoatchat/for-desktop/releases/tag/v${finalAttrs.version}";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [
heyimnova
magistau
v3rm1n0
RossSmyth
];
platforms = lib.platforms.linux;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
platforms = with lib.platforms; linux ++ darwin;
mainProgram = "stoat-desktop";
};
}
})