discord: use distro layout for stable on Linux
This commit is contained in:
@@ -87,31 +87,13 @@ let
|
|||||||
];
|
];
|
||||||
enabledDiscordModsCount = builtins.length (lib.filter (x: x) discordMods);
|
enabledDiscordModsCount = builtins.length (lib.filter (x: x) discordMods);
|
||||||
|
|
||||||
# Starting with discord-development 0.0.235, the linux tarball ships only a
|
|
||||||
# small `updater_bootstrap` ELF that downloads the real app at first launch
|
|
||||||
#
|
|
||||||
# That binary always fetches the latest version from Discord's CDN with no way
|
|
||||||
# to pin, making the build impure and the nix version a lie
|
|
||||||
#
|
|
||||||
# Instead we fetch the app directly from the distributions API at build time:
|
|
||||||
# https://updates.discord.com/distributions/app/manifests/latest?channel=...
|
|
||||||
# The host + module distros are brotli-compressed tars on Discord's CDN at
|
|
||||||
# predictable URLs with SHA256 hashes in the manifest
|
|
||||||
isDistro = source.kind == "distro";
|
|
||||||
|
|
||||||
inherit (source) version;
|
inherit (source) version;
|
||||||
|
|
||||||
src =
|
src = fetchurl { inherit (source.distro) url hash; };
|
||||||
if isDistro then
|
|
||||||
fetchurl { inherit (source.distro) url hash; }
|
|
||||||
else
|
|
||||||
fetchurl { inherit (source) url hash; };
|
|
||||||
|
|
||||||
moduleSrcs = lib.optionalAttrs isDistro (
|
moduleSrcs = lib.mapAttrs (_: mod: fetchurl { inherit (mod) url hash; }) source.modules;
|
||||||
lib.mapAttrs (_: mod: fetchurl { inherit (mod) url hash; }) source.modules
|
|
||||||
);
|
|
||||||
|
|
||||||
moduleVersions = lib.optionalAttrs isDistro (lib.mapAttrs (_: mod: mod.version) source.modules);
|
moduleVersions = lib.mapAttrs (_: mod: mod.version) source.modules;
|
||||||
|
|
||||||
libPath = lib.makeLibraryPath (
|
libPath = lib.makeLibraryPath (
|
||||||
[
|
[
|
||||||
@@ -218,8 +200,8 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
libxshmfence
|
libxshmfence
|
||||||
wrapGAppsHook3
|
wrapGAppsHook3
|
||||||
makeShellWrapper
|
makeShellWrapper
|
||||||
]
|
brotli
|
||||||
++ lib.optionals isDistro [ brotli ];
|
];
|
||||||
|
|
||||||
dontWrapGApps = true;
|
dontWrapGApps = true;
|
||||||
|
|
||||||
@@ -228,20 +210,20 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
libgbm
|
libgbm
|
||||||
nspr
|
nspr
|
||||||
nss
|
nss
|
||||||
]
|
# The distro layout ships prebuilt `.node` modules:
|
||||||
# The new distro layout ships prebuilt `.node` modules:
|
# discord_dispatch is linked against openssl 1.1, discord_voice against libpulseaudio.
|
||||||
# discord_dispatch is linked against openssl 1.1, discord_voice against libpulseaudio.
|
# Ignore the missing dependency on insecure openssl_1_1: discord_dispatch is
|
||||||
# Ignore the missing dependency on insecure openssl_1_1: discord_dispatch is
|
# effectively unused in practice.
|
||||||
# effectively unused in practice.
|
libpulseaudio
|
||||||
++ lib.optionals isDistro [ libpulseaudio ];
|
];
|
||||||
|
|
||||||
strictDeps = true;
|
strictDeps = true;
|
||||||
|
|
||||||
dontUnpack = isDistro;
|
dontUnpack = true;
|
||||||
|
|
||||||
inherit libPath;
|
inherit libPath;
|
||||||
|
|
||||||
autoPatchelfIgnoreMissingDeps = lib.optionals isDistro [
|
autoPatchelfIgnoreMissingDeps = [
|
||||||
"libssl.so.1.1"
|
"libssl.so.1.1"
|
||||||
"libcrypto.so.1.1"
|
"libcrypto.so.1.1"
|
||||||
];
|
];
|
||||||
@@ -250,41 +232,22 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
runHook preInstall
|
runHook preInstall
|
||||||
|
|
||||||
mkdir -p $out/{bin,opt/${binaryName},share/icons/hicolor/256x256/apps}
|
mkdir -p $out/{bin,opt/${binaryName},share/icons/hicolor/256x256/apps}
|
||||||
''
|
|
||||||
+ (
|
|
||||||
if isDistro then
|
|
||||||
''
|
|
||||||
# Distro layout (currently discord-ptb, discord-canary and discord-development):
|
|
||||||
#
|
|
||||||
# The host distro is a brotli-compressed tar with all files under a `files/`
|
|
||||||
# prefix (the channel binary, libffmpeg.so, resources/, etc). Module distros
|
|
||||||
# follow the same format with module contents under `files/`
|
|
||||||
#
|
|
||||||
# The module directory layout must match what Discord's node runtime
|
|
||||||
# expects: modules/<name>/ (the moduleUpdater extracts zips into
|
|
||||||
# path.join(moduleInstallPath, moduleName) see processUnzipQueue)
|
|
||||||
|
|
||||||
brotli -d < $src | tar xf - --strip-components=1 -C $out/opt/${binaryName}
|
# The host distro is a brotli-compressed tar with all files under a `files/`
|
||||||
chmod +x $out/opt/${binaryName}/${binaryName}
|
# prefix (the channel binary, libffmpeg.so, resources/, etc). Module distros
|
||||||
|
# follow the same format with module contents under `files/`
|
||||||
|
brotli -d < $src | tar xf - --strip-components=1 -C $out/opt/${binaryName}
|
||||||
|
chmod +x $out/opt/${binaryName}/${binaryName}
|
||||||
|
|
||||||
# Extract native modules
|
# The module directory layout must match what Discord's node runtime
|
||||||
${lib.concatStringsSep "\n" (
|
# expects: modules/<name>/ (the moduleUpdater extracts zips into
|
||||||
lib.mapAttrsToList (name: src: ''
|
# path.join(moduleInstallPath, moduleName) see processUnzipQueue)
|
||||||
mkdir -p $out/opt/${binaryName}/modules/${name}
|
${lib.concatStringsSep "\n" (
|
||||||
brotli -d < ${src} | tar xf - --strip-components=1 -C $out/opt/${binaryName}/modules/${name}
|
lib.mapAttrsToList (name: src: ''
|
||||||
'') moduleSrcs
|
mkdir -p $out/opt/${binaryName}/modules/${name}
|
||||||
)}
|
brotli -d < ${src} | tar xf - --strip-components=1 -C $out/opt/${binaryName}/modules/${name}
|
||||||
|
'') moduleSrcs
|
||||||
''
|
)}
|
||||||
else
|
|
||||||
''
|
|
||||||
# Tarball layout (stable): the tarball unpacks into a
|
|
||||||
# directory containing the channel binary directly
|
|
||||||
mv * $out/opt/${binaryName}
|
|
||||||
chmod +x $out/opt/${binaryName}/${binaryName}
|
|
||||||
''
|
|
||||||
)
|
|
||||||
+ ''
|
|
||||||
|
|
||||||
wrapProgramShell $out/opt/${binaryName}/${binaryName} \
|
wrapProgramShell $out/opt/${binaryName}/${binaryName} \
|
||||||
"''${gappsWrapperArgs[@]}" \
|
"''${gappsWrapperArgs[@]}" \
|
||||||
@@ -297,7 +260,7 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
--prefix XDG_DATA_DIRS : "${gtk3}/share/gsettings-schemas/${gtk3.name}/" \
|
--prefix XDG_DATA_DIRS : "${gtk3}/share/gsettings-schemas/${gtk3.name}/" \
|
||||||
--prefix LD_LIBRARY_PATH : ${finalAttrs.libPath}:$out/opt/${binaryName} \
|
--prefix LD_LIBRARY_PATH : ${finalAttrs.libPath}:$out/opt/${binaryName} \
|
||||||
${lib.strings.optionalString disableUpdates "--run ${lib.getExe disableBreakingUpdates}"} \
|
${lib.strings.optionalString disableUpdates "--run ${lib.getExe disableBreakingUpdates}"} \
|
||||||
${lib.strings.optionalString isDistro ''--run "${stageModules} $out/opt/${binaryName}/modules"''} \
|
--run "${stageModules} $out/opt/${binaryName}/modules" \
|
||||||
--add-flags ${lib.escapeShellArg commandLineArgs}
|
--add-flags ${lib.escapeShellArg commandLineArgs}
|
||||||
|
|
||||||
ln -s $out/opt/${binaryName}/${binaryName} $out/bin/
|
ln -s $out/opt/${binaryName}/${binaryName} $out/bin/
|
||||||
|
|||||||
@@ -210,10 +210,74 @@
|
|||||||
"version": "1.0.189"
|
"version": "1.0.189"
|
||||||
},
|
},
|
||||||
"linux-stable": {
|
"linux-stable": {
|
||||||
"hash": "sha256-vMuoz1OR0cKvrfT/ilkNXEtEP3zEwyNGh6AW5iQADws=",
|
"distro": {
|
||||||
"kind": "legacy",
|
"hash": "sha256-RlQEGuQlnvISzvNAXtJAEaHSvC/8AhNcfEc8paV9JKA=",
|
||||||
"url": "https://stable.dl2.discordapp.net/apps/linux/0.0.135/discord-0.0.135.tar.gz",
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/full.distro"
|
||||||
"version": "0.0.135"
|
},
|
||||||
|
"kind": "distro",
|
||||||
|
"modules": {
|
||||||
|
"discord_cloudsync": {
|
||||||
|
"hash": "sha256-9x/7+65hT5mcOOlUcSkWa7As+6Bxdv9vps/ZYgj+8TI=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_cloudsync/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_desktop_core": {
|
||||||
|
"hash": "sha256-9ocCcvhubWXUCwPewJdKolt0CRbunzVIjWUsser1NA4=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_desktop_core/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_dispatch": {
|
||||||
|
"hash": "sha256-3Hqi3/5zfmDheMIbWN9l8qb/bNo9/pzfxQqYureCfMI=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_dispatch/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_erlpack": {
|
||||||
|
"hash": "sha256-lSR9PV2nG5+vgNqpjUrC8ygKv8bfvUk+i+F7nCEjV1Q=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_erlpack/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_game_utils": {
|
||||||
|
"hash": "sha256-jf3Gf95QmZVjzAB0Ui2eSErP58hNd+YRyyYKe9xtQlQ=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_game_utils/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_krisp": {
|
||||||
|
"hash": "sha256-jrEaudW1wI4dKIvZd+1/CfybdWainF9TApptzffxQiI=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_krisp/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_modules": {
|
||||||
|
"hash": "sha256-jN+R1e8aDVXyq6J+1+h8Hienli7pj+xhZU8PUKCtXn8=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_modules/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_rpc": {
|
||||||
|
"hash": "sha256-f/rSx/dFSmORLVPNvG5iqJb1KN5CBchXEUzwJwP21zU=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_rpc/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_spellcheck": {
|
||||||
|
"hash": "sha256-t1Y8DGpVQ1pzCz6tScaTnY9KvxSnUnIk26twTVupdX4=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_spellcheck/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_utils": {
|
||||||
|
"hash": "sha256-FH0Fb4M+L+WETHQBJuFqbS/h0nLlWTTTnV7lp1lqcCU=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_utils/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_voice": {
|
||||||
|
"hash": "sha256-X5u3XuXdco84LG0lZS0uAgks0XjesxOltYGn0XP3akQ=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_voice/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"discord_zstd": {
|
||||||
|
"hash": "sha256-tZgzaVh2/CrvtYPOVJE3vrZuWbs9JxQSi74KeNf0mJw=",
|
||||||
|
"url": "https://stable.dl2.discordapp.net/distro/app/stable/linux/x64/1.0.137/discord_zstd/1/full.distro",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": "1.0.137"
|
||||||
},
|
},
|
||||||
"osx-canary": {
|
"osx-canary": {
|
||||||
"distro": {
|
"distro": {
|
||||||
|
|||||||
Reference in New Issue
Block a user