2025-08-17 18:43:20 +00:00

265 lines
7.6 KiB
Nix

{
stdenv,
lib,
fetchurl,
makeWrapper,
xar,
cpio,
callPackage,
nixosTests,
buildFHSEnv,
# Support pulseaudio by default
pulseaudioSupport ? true,
# Whether to support XDG portals at all
xdgDesktopPortalSupport ? (
plasma6XdgDesktopPortalSupport
|| plasma5XdgDesktopPortalSupport
|| lxqtXdgDesktopPortalSupport
|| gnomeXdgDesktopPortalSupport
|| hyprlandXdgDesktopPortalSupport
|| wlrXdgDesktopPortalSupport
|| xappXdgDesktopPortalSupport
),
# This is Plasma 6 (KDE) XDG portal support
plasma6XdgDesktopPortalSupport ? false,
# This is Plasma 5 (KDE) XDG portal support
plasma5XdgDesktopPortalSupport ? false,
# This is LXQT XDG portal support
lxqtXdgDesktopPortalSupport ? false,
# This is GNOME XDG portal support
gnomeXdgDesktopPortalSupport ? false,
# This is Hyprland XDG portal support
hyprlandXdgDesktopPortalSupport ? false,
# This is `wlroots` XDG portal support
wlrXdgDesktopPortalSupport ? false,
# This is Xapp XDG portal support, used for GTK and various Cinnamon/MATE/Xfce4 infrastructure.
xappXdgDesktopPortalSupport ? false,
# This function can be overridden to add in extra packages
targetPkgs ? pkgs: [ ],
# This list can be overridden to add in extra packages
# that are independent of the underlying package attrset
targetPkgsFixed ? [ ],
}:
let
inherit (stdenv.hostPlatform) system;
# Zoom versions are released at different times per platform and often with different versions.
# We write them on three lines like this (rather than using {}) so that the updater script can
# find where to edit them.
versions.aarch64-darwin = "6.5.9.61929";
versions.x86_64-darwin = "6.5.9.61929";
# This is the fallback version so that evaluation can produce a meaningful result.
versions.x86_64-linux = "6.5.9.3723";
srcs = {
aarch64-darwin = fetchurl {
url = "https://zoom.us/client/${versions.aarch64-darwin}/zoomusInstallerFull.pkg?archType=arm64";
name = "zoomusInstallerFull.pkg";
hash = "sha256-2V4Cad7/YcI5rSuUu8GI1GCEgio/rG/ZRpedNKqoGvc=";
};
x86_64-darwin = fetchurl {
url = "https://zoom.us/client/${versions.x86_64-darwin}/zoomusInstallerFull.pkg";
hash = "sha256-RO+kIHvmvCj9bun2BeCzAm9XMYQOobYyVKqA5ruG0I8=";
};
x86_64-linux = fetchurl {
url = "https://zoom.us/client/${versions.x86_64-linux}/zoom_x86_64.pkg.tar.xz";
hash = "sha256-OOa4zRRekXEWLl+BH3bPtCQzRaQAo742C9EqPTZnDR8=";
};
};
unpacked = stdenv.mkDerivation {
pname = "zoom";
version = versions.${system} or versions.x86_64-linux;
src = srcs.${system} or srcs.x86_64-linux;
dontUnpack = stdenv.hostPlatform.isLinux;
unpackPhase = lib.optionalString stdenv.hostPlatform.isDarwin ''
xar -xf $src
zcat < zoomus.pkg/Payload | cpio -i
'';
# Note: In order to uncover missing libraries
# on x86_64-linux, add "pkgs" to this file's arguments
# (at the top of this file), then add these attributes here:
# > buildInputs = linuxGetDependencies pkgs;
# > dontAutoPatchelf = true;
# > dontWrapQtApps = true;
# > preFixup = ''
# > addAutoPatchelfSearchPath $out/opt/zoom
# > autoPatchelf $out/opt/zoom/{cef,Qt,*.so*,aomhost,zoom,zopen,ZoomLauncher,ZoomWebviewHost}
# > '';
# ...and finally "pkgs.autoPatchelfHook"
# to `nativeBuildInputs` right below.
# Then build `zoom-us.unpacked`:
# `autoPatchelfHook` will report missing library files.
nativeBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
makeWrapper
xar
cpio
];
installPhase = ''
runHook preInstall
''
+ (
if stdenv.hostPlatform.isDarwin then
''
mkdir -p $out/Applications
cp -R zoom.us.app $out/Applications/
''
else
''
mkdir $out
tar -C $out -xf $src
mv $out/usr/* $out/
''
)
+ ''
runHook postInstall
'';
postFixup = lib.optionalString stdenv.hostPlatform.isDarwin ''
makeWrapper $out/Applications/zoom.us.app/Contents/MacOS/zoom.us $out/bin/zoom
'';
dontPatchELF = true;
passthru.updateScript = ./update.sh;
passthru.tests.startwindow = callPackage ./test.nix { };
passthru.tests.nixos-module = nixosTests.zoom-us;
meta = {
homepage = "https://zoom.us/";
changelog = "https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0061222";
description = "zoom.us video conferencing application";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.unfree;
platforms = builtins.attrNames srcs;
maintainers = with lib.maintainers; [
philiptaron
ryan4yin
yarny
];
mainProgram = "zoom";
};
};
# linux definitions
linuxGetDependencies =
pkgs:
[
pkgs.alsa-lib
pkgs.at-spi2-atk
pkgs.at-spi2-core
pkgs.atk
pkgs.cairo
pkgs.coreutils
pkgs.cups
pkgs.dbus
pkgs.expat
pkgs.fontconfig
pkgs.freetype
pkgs.gdk-pixbuf
pkgs.glib
pkgs.glib.dev
pkgs.gtk3
pkgs.libGL
pkgs.libdrm
pkgs.libgbm
pkgs.libkrb5
pkgs.libxkbcommon
pkgs.nspr
pkgs.nss
pkgs.pango
pkgs.pciutils
pkgs.pipewire
pkgs.procps
pkgs.qt5.qt3d
pkgs.qt5.qtgamepad
pkgs.qt5.qtlottie
pkgs.qt5.qtmultimedia
pkgs.qt5.qtremoteobjects
pkgs.qt5.qtxmlpatterns
pkgs.stdenv.cc.cc
pkgs.udev
pkgs.util-linux
pkgs.wayland
pkgs.xorg.libX11
pkgs.xorg.libXcomposite
pkgs.xorg.libXdamage
pkgs.xorg.libXext
pkgs.xorg.libXfixes
pkgs.xorg.libXrandr
pkgs.xorg.libXrender
pkgs.xorg.libXtst
pkgs.xorg.libxcb
pkgs.xorg.libxshmfence
pkgs.xorg.xcbutilimage
pkgs.xorg.xcbutilkeysyms
pkgs.xorg.xcbutilrenderutil
pkgs.xorg.xcbutilwm
pkgs.zlib
]
++ lib.optionals pulseaudioSupport [
pkgs.libpulseaudio
pkgs.pulseaudio
]
++ lib.optional xdgDesktopPortalSupport pkgs.xdg-desktop-portal
++ lib.optional plasma6XdgDesktopPortalSupport pkgs.kdePackages.xdg-desktop-portal-kde
++ lib.optional plasma5XdgDesktopPortalSupport pkgs.plasma5Packages.xdg-desktop-portal-kde
++ lib.optional lxqtXdgDesktopPortalSupport pkgs.lxqt.xdg-desktop-portal-lxqt
++ lib.optionals gnomeXdgDesktopPortalSupport [
pkgs.xdg-desktop-portal-gnome
pkgs.xdg-desktop-portal-gtk
]
++ lib.optional hyprlandXdgDesktopPortalSupport pkgs.xdg-desktop-portal-hyprland
++ lib.optional wlrXdgDesktopPortalSupport pkgs.xdg-desktop-portal-wlr
++ lib.optional xappXdgDesktopPortalSupport pkgs.xdg-desktop-portal-xapp
++ targetPkgs pkgs
++ targetPkgsFixed;
in
if !stdenv.hostPlatform.isLinux then
unpacked
else
# We add the `unpacked` zoom archive to the FHS env and also bind-mount its `/opt` directory.
# This should assist Zoom in finding all its files in the places where it expects them to be.
buildFHSEnv {
inherit (unpacked) pname version;
targetPkgs = pkgs: (linuxGetDependencies pkgs) ++ [ unpacked ];
extraPreBwrapCmds = "unset QT_PLUGIN_PATH";
extraBwrapArgs = [ "--ro-bind ${unpacked}/opt /opt" ];
runScript = "/opt/zoom/ZoomLauncher";
extraInstallCommands = ''
cp -Rt $out/ ${unpacked}/share
substituteInPlace \
$out/share/applications/Zoom.desktop \
--replace-fail Exec={/usr/bin/,}zoom
# Backwards compatibility: we also call it zoom-us
ln -s $out/bin/{zoom,zoom-us}
'';
passthru = unpacked.passthru // {
inherit unpacked;
};
inherit (unpacked) meta;
}