Files
omarchy-pkgs/pkgbuilds/slack-desktop/PKGBUILD
T
Ryan Hughes 418a48bef6 Add slack-desktop for aarch64 on a native Electron runtime
Slack only publishes an x86_64 Linux build, so the AUR recipe produces an
aarch64 package full of x86_64 binaries that cannot start. Run Slack's
application code on the AArch64 build of the Electron release it ships
with, replace the three native addons Slack requires at boot with
JavaScript equivalents, and drop the x86_64 addons it can do without.
2026-10-05 12:26:23 -04:00

161 lines
5.7 KiB
Bash

# Maintainer: Ryan Hughes <ryan@omarchy.org>
pkgname=slack-desktop
pkgver=4.52.171
pkgrel=1
# Slack publishes Linux builds for x86_64 only. Its application code runs
# unchanged on the AArch64 build of the Electron release it ships with; see
# README.md for the native modules that are replaced or dropped.
_electronver=44.4.5
pkgdesc='Slack Desktop for Linux on a native AArch64 Electron runtime'
arch=('aarch64')
url='https://slack.com/downloads'
license=('custom')
depends=(
'alsa-lib'
'at-spi2-core'
'cairo'
'dbus'
'expat'
'fontconfig'
'gcc-libs'
'glib2'
'glibc'
'gtk3'
'libcups'
'libnotify'
'libsecret'
'libx11'
'libxcb'
'libxcomposite'
'libxdamage'
'libxext'
'libxfixes'
'libxkbcommon'
'libxrandr'
'mesa'
'nspr'
'nss'
'pango'
'systemd-libs'
'xdg-utils'
)
optdepends=(
'libappindicator-gtk3: Systray indicator support'
'org.freedesktop.secrets: Keyring password store support'
)
makedepends=('asar')
options=('!debug' '!strip')
source=(
"slack-desktop-${pkgver}-amd64.deb::https://downloads.slack-edge.com/desktop-releases/linux/x64/${pkgver}/slack-desktop-${pkgver}-amd64.deb"
"electron-v${_electronver}-linux-arm64.zip::https://github.com/electron/electron/releases/download/v${_electronver}/electron-v${_electronver}-linux-arm64.zip"
'slack.desktop'
'slack-desktop-utils.js'
'file-handler-info.js'
'electron-native-auth.js'
)
noextract=(
"slack-desktop-${pkgver}-amd64.deb"
"electron-v${_electronver}-linux-arm64.zip"
)
sha256sums=('c6199816e6d842289869a9e84a05042af6e0de68959df7a15e7273873b86dc36'
'3bf0acab49c4ea3c9283cdb86bf3dd7204bd52a6fba6c8ae51101bdba2adae0e'
'e438e78265f3e566990300946afb4ea5d09bcd8c426738ab8f486ae9ddb86c0f'
'6de40409af5a04605c3287cb3c661132eb55a4f636f7cd9bbfd456f4adf41971'
'a2a8fd45daa4f493ad4487da9f01477233feecfef360ed366bfb0a58f804890a'
'9cd53c84fdc407c83f2ca6e9485916296f3712b2742dcc0acf22fda5195ead50')
# x86_64 addons in Slack's app that can never load on AArch64. The three that
# Slack requires on Linux are replaced by the JavaScript files above; the rest
# are Windows/macOS helpers or degrade on failure (native-keymap). Any other
# foreign binary fails the build so a new native module gets reviewed.
_x86_addons=(
'@tinyspeck/slack-desktop-utils/lib/binding/napi-v8/slackdesktoputils.node'
'file-handler-info/build/Release/file_handler_info.node'
'electron-native-auth/build/Release/electron_native_auth.node'
'@tinyspeck/native-keymap/build/Release/keymapping.node'
'cf-prefs/build/Release/cf-prefs.node'
'macos-notification-state/build/Release/notificationstate.node'
'registry-js/build/Release/registry.node'
'windows-focus-assist/build/Release/focusassist.node'
)
prepare() {
rm -rf slack electron app
mkdir slack electron
bsdtar -O -xf "slack-desktop-${pkgver}-amd64.deb" 'data.tar.*' | bsdtar -C slack -xf -
bsdtar -C electron -xf "electron-v${_electronver}-linux-arm64.zip"
local slack_electron
slack_electron=$(<slack/usr/lib/slack/version)
if [[ $slack_electron != "$_electronver" ]]; then
error "Slack $pkgver ships Electron $slack_electron, but _electronver is $_electronver."
plain "Set _electronver=$slack_electron and update its checksum."
return 1
fi
# Electron loads resources/app ahead of app.asar, so the extracted tree can
# carry the replacement modules without repacking the archive.
asar extract slack/usr/lib/slack/resources/app.asar app
}
package() {
local lib="$pkgdir/usr/lib/slack"
local app="$lib/resources/app"
install -d "$lib"
cp -a --no-preserve=ownership electron/. "$lib/"
mv "$lib/electron" "$lib/slack"
rm -f "$lib/resources/default_app.asar" "$lib/LICENSE"
find slack/usr/lib/slack/resources -maxdepth 1 -type f ! -name app.asar \
-exec cp --no-preserve=ownership -t "$lib/resources" {} +
cp -a --no-preserve=ownership app "$app"
local shim target
for shim in \
'slack-desktop-utils.js:@tinyspeck/slack-desktop-utils/lib/index.js' \
'file-handler-info.js:file-handler-info/index.js' \
'electron-native-auth.js:electron-native-auth/index.js'; do
target="$app/node_modules/${shim#*:}"
if [[ ! -f $target ]]; then
error "Slack $pkgver no longer ships ${shim#*:}; review the replacement modules."
return 1
fi
install -m644 "$srcdir/${shim%%:*}" "$target"
done
local addon
for addon in "${_x86_addons[@]}"; do
rm -f "$app/node_modules/$addon"
done
local file machine
while IFS= read -r -d '' file; do
machine=$(readelf -h "$file" 2>/dev/null |
sed -n 's/^[[:space:]]*Machine:[[:space:]]*//p')
case "$machine" in
'' | AArch64) ;;
*) error "Unexpected ${machine} binary: ${file#"$pkgdir"}"; return 1 ;;
esac
done < <(find "$lib" -type f -print0)
find "$lib" -type d -exec chmod 755 {} +
find "$lib" -type f -exec chmod 644 {} +
# Chromium sandboxes through unprivileged user namespaces, which Arch-family
# kernels allow; a setuid-root helper is not needed.
chmod 755 "$lib/slack" "$lib/chrome_crashpad_handler" "$lib/chrome-sandbox"
install -d "$pkgdir/usr/bin"
ln -s /usr/lib/slack/slack "$pkgdir/usr/bin/slack"
install -Dm644 slack.desktop "$pkgdir/usr/share/applications/slack.desktop"
install -Dm644 slack/usr/share/pixmaps/slack.png \
"$pkgdir/usr/share/icons/hicolor/512x512/apps/slack.png"
local licenses="$pkgdir/usr/share/licenses/$pkgname"
install -Dm644 slack/usr/lib/slack/LICENSE "$licenses/LICENSE"
install -Dm644 slack/usr/share/doc/slack-desktop/OPEN_SOURCE_LICENSE_ATTRIBUTIONS \
"$licenses/OPEN_SOURCE_LICENSE_ATTRIBUTIONS"
install -Dm644 electron/LICENSE "$licenses/LICENSE.electron.txt"
install -Dm644 electron/LICENSES.chromium.html "$licenses/LICENSES.chromium.html"
}