Files
omarchy-pkgs/pkgbuilds/slack-desktop/PKGBUILD
T

189 lines
6.4 KiB
Bash

# Maintainer: Ryan Hughes <ryan@omarchy.org>
pkgname=slack-desktop
pkgver=4.52.178
pkgrel=1
# Slack publishes Linux builds for x86_64 only, which this package installs
# unchanged. On AArch64 the same application code runs on the AArch64 build
# of the Electron release Slack ships with; see README.md for the native
# modules that are replaced or dropped there.
_electronver=44.4.5
pkgdesc='Slack Desktop for Linux'
arch=('x86_64' '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_aarch64=('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"
'slack.desktop'
)
source_aarch64=(
"electron-v${_electronver}-linux-arm64.zip::https://github.com/electron/electron/releases/download/v${_electronver}/electron-v${_electronver}-linux-arm64.zip"
'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=('1f110efeeb7d82e927fa209cd767278f27a4ddc7fed4a60c23fbc4ab374e1d3a' 'e438e78265f3e566990300946afb4ea5d09bcd8c426738ab8f486ae9ddb86c0f')
sha256sums_aarch64=('3bf0acab49c4ea3c9283cdb86bf3dd7204bd52a6fba6c8ae51101bdba2adae0e'
'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
bsdtar -O -xf "slack-desktop-${pkgver}-amd64.deb" 'data.tar.*' | bsdtar -C slack -xf -
[[ $CARCH == aarch64 ]] || return 0
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
mkdir electron
bsdtar -C electron -xf "electron-v${_electronver}-linux-arm64.zip"
# 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
}
_install_aarch64_runtime() {
local lib=$1
local app="$lib/resources/app"
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
}
package() {
local lib="$pkgdir/usr/lib/slack"
local expected_machine
install -d "$lib"
case "$CARCH" in
x86_64)
cp -a --no-preserve=ownership slack/usr/lib/slack/. "$lib/"
rm -f "$lib/LICENSE"
rm -rf "$lib/src"
expected_machine='Advanced Micro Devices X86-64'
;;
aarch64)
_install_aarch64_runtime "$lib" || return 1
expected_machine=AArch64
;;
esac
local file machine
while IFS= read -r -d '' file; do
machine=$(readelf -h "$file" 2>/dev/null |
sed -n 's/^[[:space:]]*Machine:[[:space:]]*//p')
if [[ -n $machine && $machine != "$expected_machine" ]]; then
error "Unexpected ${machine} binary: ${file#"$pkgdir"}"
return 1
fi
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"
if [[ $CARCH == aarch64 ]]; then
install -Dm644 electron/LICENSE "$licenses/LICENSE.electron.txt"
install -Dm644 electron/LICENSES.chromium.html "$licenses/LICENSES.chromium.html"
else
install -Dm644 slack/usr/lib/slack/resources/LICENSES.chromium.html \
"$licenses/LICENSES.chromium.html"
fi
}