From 0175f90c3fdb925b8e880a921acad7c6cc63df38 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 27 May 2026 15:32:38 +0200 Subject: [PATCH] Add rustdesk package --- pkgbuilds/rustdesk/.omarchy/package.json | 4 + .../0000-disable-update-check@rustdesk.patch | 16 + ...-version-for-flutter.3.22.3@rustdesk.patch | 16 + .../0002-screen_retriever@rustdesk.patch | 11 + .../rustdesk/0003-mkvparser.cc-cstdint.patch | 10 + .../rustdesk/0004-bindgen@rustdesk.patch | 27 + pkgbuilds/rustdesk/PKGBUILD | 664 ++++++++++++++++++ pkgbuilds/rustdesk/rustdesk.install | 15 + 8 files changed, 763 insertions(+) create mode 100644 pkgbuilds/rustdesk/.omarchy/package.json create mode 100644 pkgbuilds/rustdesk/0000-disable-update-check@rustdesk.patch create mode 100644 pkgbuilds/rustdesk/0001-extended_text-drop-version-for-flutter.3.22.3@rustdesk.patch create mode 100644 pkgbuilds/rustdesk/0002-screen_retriever@rustdesk.patch create mode 100644 pkgbuilds/rustdesk/0003-mkvparser.cc-cstdint.patch create mode 100644 pkgbuilds/rustdesk/0004-bindgen@rustdesk.patch create mode 100644 pkgbuilds/rustdesk/PKGBUILD create mode 100644 pkgbuilds/rustdesk/rustdesk.install diff --git a/pkgbuilds/rustdesk/.omarchy/package.json b/pkgbuilds/rustdesk/.omarchy/package.json new file mode 100644 index 0000000..6dce4e4 --- /dev/null +++ b/pkgbuilds/rustdesk/.omarchy/package.json @@ -0,0 +1,4 @@ +{ + "source": "aur", + "upstream_commit": "06f4b8e84937022c0fec52b2e71a71bcf50c0d17" +} diff --git a/pkgbuilds/rustdesk/0000-disable-update-check@rustdesk.patch b/pkgbuilds/rustdesk/0000-disable-update-check@rustdesk.patch new file mode 100644 index 0000000..4f4d467 --- /dev/null +++ b/pkgbuilds/rustdesk/0000-disable-update-check@rustdesk.patch @@ -0,0 +1,16 @@ +diff -pNaru5 a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart +--- a/flutter/lib/desktop/pages/desktop_home_page.dart 2024-12-21 02:09:03.000000000 -0500 ++++ b/flutter/lib/desktop/pages/desktop_home_page.dart 2024-12-23 00:34:54.631074022 -0500 +@@ -422,11 +422,11 @@ class _DesktopHomePageState extends Stat + ), + ); + } + + Widget buildHelpCards(String updateUrl) { +- if (!bind.isCustomClient() && ++ if (false && !bind.isCustomClient() && + updateUrl.isNotEmpty && + !isCardClosed && + bind.mainUriPrefixSync().contains('rustdesk')) { + return buildInstallCard( + "Status", diff --git a/pkgbuilds/rustdesk/0001-extended_text-drop-version-for-flutter.3.22.3@rustdesk.patch b/pkgbuilds/rustdesk/0001-extended_text-drop-version-for-flutter.3.22.3@rustdesk.patch new file mode 100644 index 0000000..b663034 --- /dev/null +++ b/pkgbuilds/rustdesk/0001-extended_text-drop-version-for-flutter.3.22.3@rustdesk.patch @@ -0,0 +1,16 @@ +diff -pNaru5 a/flutter/pubspec.yaml b/flutter/pubspec.yaml +--- a/flutter/pubspec.yaml 2025-07-23 09:44:30.293953846 -0400 ++++ b/flutter/pubspec.yaml 2025-07-23 09:44:53.294155752 -0400 +@@ -104,11 +104,11 @@ dependencies: + url: https://github.com/rustdesk-org/dynamic_layouts.git + ref: 24cb88413fa5181d949ddacbb30a65d5c459e7d9 + pull_down_button: ^0.9.3 + device_info_plus: ^9.1.0 + qr_flutter: ^4.1.0 +- extended_text: 14.0.0 ++ extended_text: 13.1.0 + xterm: 4.0.0 + sqflite: 2.2.0 + google_fonts: ^6.2.1 + + dev_dependencies: diff --git a/pkgbuilds/rustdesk/0002-screen_retriever@rustdesk.patch b/pkgbuilds/rustdesk/0002-screen_retriever@rustdesk.patch new file mode 100644 index 0000000..cfb4bda --- /dev/null +++ b/pkgbuilds/rustdesk/0002-screen_retriever@rustdesk.patch @@ -0,0 +1,11 @@ +diff -pNaru3 a/flutter/pubspec.yaml b/flutter/pubspec.yaml +--- a/flutter/pubspec.yaml 2025-01-06 01:00:58.263460942 -0500 ++++ b/flutter/pubspec.yaml 2025-01-06 01:01:23.960122697 -0500 +@@ -27,6 +27,7 @@ dependencies: + flutter_localizations: + sdk: flutter + ++ screen_retriever: + ffi: ^2.1.0 + path_provider: ^2.1.1 + external_path: ^1.0.3 diff --git a/pkgbuilds/rustdesk/0003-mkvparser.cc-cstdint.patch b/pkgbuilds/rustdesk/0003-mkvparser.cc-cstdint.patch new file mode 100644 index 0000000..5a8bbcd --- /dev/null +++ b/pkgbuilds/rustdesk/0003-mkvparser.cc-cstdint.patch @@ -0,0 +1,10 @@ +--- mkvparser.cc.old 2025-05-05 16:41:32.480450346 -0400 ++++ mkvparser.cc 2025-05-05 16:44:56.578245385 -0400 +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/pkgbuilds/rustdesk/0004-bindgen@rustdesk.patch b/pkgbuilds/rustdesk/0004-bindgen@rustdesk.patch new file mode 100644 index 0000000..93fda60 --- /dev/null +++ b/pkgbuilds/rustdesk/0004-bindgen@rustdesk.patch @@ -0,0 +1,27 @@ + kevinlpowell commented on 2026-04-15 04:01 (UTC) (edited on 2026-04-15 04:04 (UTC) by kevinlpowell) + +The build errors from the scrap dependency are due to an old version of bindgen that is not compatible with Clang22. There's no need to install an outdated version of Clang as a workaround. Just update the requested version of bindgen to latest (0.72.1) like so: (and don't forget to "updpkgsums") + +diff -ur a/Cargo.toml b/Cargo.toml +--- a/Cargo.toml 2026-03-04 20:30:40.000000000 -0800 ++++ b/Cargo.toml 2026-04-14 20:52:35.970758354 -0700 +@@ -211,6 +211,7 @@ + # This allows building and running on systems without libxdo installed (e.g., Wayland-only) + [patch.crates-io] + libxdo-sys = { path = "libs/libxdo-sys-stub" } ++bindgen = { git = "https://github.com/rust-lang/rust-bindgen", tag = "v0.72.1" } + + [package.metadata.winres] + LegalCopyright = "Copyright © 2025 Purslane Ltd. All rights reserved." +diff -ur a/libs/scrap/Cargo.toml b/libs/scrap/Cargo.toml +--- a/libs/scrap/Cargo.toml 2026-03-04 20:30:40.000000000 -0800 ++++ b/libs/scrap/Cargo.toml 2026-04-14 20:52:35.969638453 -0700 +@@ -48,7 +48,7 @@ + + [build-dependencies] + target_build_utils = "0.3" +-bindgen = "0.65" ++bindgen = "0.72.1" + pkg-config = { version = "0.3.27", optional = true } + + [target.'cfg(target_os = "linux")'.dependencies] diff --git a/pkgbuilds/rustdesk/PKGBUILD b/pkgbuilds/rustdesk/PKGBUILD new file mode 100644 index 0000000..2429863 --- /dev/null +++ b/pkgbuilds/rustdesk/PKGBUILD @@ -0,0 +1,664 @@ +# Maintainer: Chris Severance aur.severach aATt spamgourmet dott com +# Contributor: Rojikku +# Contributor: Tech + +# Clean Chroot ccm Xeon(R) E-2146G 6c12t: ----> Total build time for 1.4.1-hwcodec was 00:21:24 +# Clean chroot build is smaller than the system build + +# rm -rf ~/.cache/vcpkg ~/.cargo ~/.pub-cache + +# 0 for PKGBUILD commands which may go out of date +# 1 for build.py which should stay current +_opt_BUILD_PY=1 + +#_opt_CLANG='+22' +_opt_CLANG='' +#_opt_CLANG='21' +_fn_setclang() { + local - + if [ ! -z "${_opt_CLANG}" ]; then + local _opt_CLANG="${_opt_CLANG#+}" + local _f + for _f in "/usr/lib/llvm${_opt_CLANG}" "/usr/lib/clang/${_opt_CLANG}"; do + if [ -d "${_f}" ]; then + export CLANG_RESOURCE_DIR="${_f}" + _f='' + break + fi + done + if [ ! -z "${_f}" ]; then + printf 'Unable to find clang%s\n' "${_opt_CLANG}" + return 1 + fi + _f=("/usr/lib/libclang.so.${_opt_CLANG}".*) + if [ "${#_f[@]}" -ne 1 ]; then + printf 'Unable to find libclang%s\n' "${_opt_CLANG}" + return 1 + fi + export LIBCLANG_PATH="${_f[0]}" + set +u; msg2 "Using clang${_opt_CLANG}"; set -u + fi +} + +#vercmp --help > /dev/null 2>&1 || vercmp() { echo '0'; } # compatible with namcap sandbox +# namcap sandbox won't let us run pacman /usr/bin/vercmp so we'll rewrite it +# No need to change vercmp that namcap doesn't see +# $1 is the complex version, could be 1.4.1.r10629.g7a3e67e +# $2 is the simple version, always 3 dotted numbers 1.4.1 +_vercmp() { + local _pla _pra _rv='0' _i + IFS='.' read -ra _pla <<< "${1##.r*}" + IFS='.' read -ra _pra <<< "$2" + for ((_i = 0 ; _i < "${#_pra[@]}" ; _i++ )); do + if [ "${_pla[_i]}" -lt "${_pra[_i]}" ]; then + _rv='-1' + break + elif [ "${_pla[_i]}" -gt "${_pra[_i]}" ]; then + _rv='1' + break + fi + done + printf '%s' "${_rv}" +} +#_vercmp '1.3.7' '1.4.1'; exit 1 +#_vercmp '1.4.1.r10629.g7a3e67e' '1.4.1'; exit 1 +#_vercmp '1.4.2' '1.4.1'; exit 1 + +# _opt_SYS_VCPKG is removed. We will never be able to use the system vcpkg. +_opt_VCPKG_COMMIT_ID='' +# Select from list an item which matches pkgver. This allows to compile recent versions without excessive PKGBUILD hacking. +# $1: pkgver +# $2: vercmp test operator -ge or -eq +_fn_VCL() { + local _q="$1" _v _vx='?' _vy='' _v1 _v2 + shift + local _t="$1" + shift + while [ "$#" -gt 0 ]; do + _v="$1" + _v1="${_v%%:*}" + _v2="${_v#*:}" + if [ "$(_vercmp "${_q}" "${_v1}")" "${_t}" 0 ]; then + _vx="${_v}" + _vy="${_v2}" + fi + shift + done + #printf '%s >= %s\n' "${_q}" "${_vx}" 1>&2 + printf '%s' "${_vy}" +} +#_opt_VCPKG_COMMIT_ID='#branch=2023.10.19' + +# _opt_SYS_FLUTTER is removed. We will never be able to use the system installed version + +# 0 for package flutter +# 1 for fvm flutter +_opt_FVM_FLUTTER=0 + +_opt_NICE='nice -n1' + +# hwcodec for H.264 H.265/HEVC stopped compiling when it went from/to +# 1.2.7 hwcodec v0.6.0 builtin (https://github.com/21pages/hwcodec#89879f2f) +# 1.3.0 hwcodec v0.7.0 vcpkg::ffmpeg (https://github.com/rustdesk-org/hwcodec#6abd1898) +# restored in 1.4.1 +# To get H264 H265/HEVC rustdesk must be compiled with vcpkg::ffmpeg build modified by rustdesk. +# +# Client and host soft codecs VP8 VP9 AV1 supported on all platforms. +# Client and host hardware codecs H264 H265 require +# Install hardware codec library package matched to the CPU or video card. restart rustdesk. +# See optdepends for which package to use. +# Host hardware codecs require +# CPU or video card support +# Use vainfo from libva-utils to list supported hardware codecs. +# VAProfileH264Main : VAEntrypointVLD +# VAProfileH264Main : VAEntrypointEncSlice +# VAProfileHEVCMain : VAEntrypointVLD +# VAProfileHEVCMain : VAEntrypointEncSlice +# Client requires hardware codec library. Codec decode support (VAEntrypointVLD) is not required. +# Host requires hardware codec library and hardware encode support (VAEntrypointEncSlice). +# Linux host may disable H265 even if supported by hardware. +# https://github.com/rustdesk/rustdesk/discussions/4095 +# Linux client without H265 decode does support H265, +# verified by connecting to a Windows host >= Skylake or Android. + +# H264 and H265 have quality issues affected by both client and host. +# One client will see heavy pixelation and green rectangles. Another +# client will be perfect. Switch between different codecs to improve quality. +# I find the best quality in this order: AV1, VP9, VP8, H264, H265 + +# https://wiki.archlinux.org/title/Hardware_video_acceleration +_fn_hwcodec() { + _opt_hwcodec_py=() + _opt_hwcodec_fe='' + _opt_hwcodec_vc=() + if :; then + _opt_hwcodec_py=('--hwcodec') + _opt_hwcodec_fe=',hwcodec' + if [ "$(_vercmp "$1" "1.3.0")" -ge 0 ]; then + _opt_hwcodec_vc=('ffmpeg') + makedepends+=('ffnvcodec-headers' 'amf-headers') + depends+=('zlib' 'libdrm') + fi + fi +} + +true "${QUIET:=}" "${logpipe:=}" + +DLAGENTS="${DLAGENTS[@]/curl /curl -L}" + +set -u +_pkgname='rustdesk' +pkgname="${_pkgname}" +_pkgver='1.4.6' +pkgver="${_pkgver//-/.}" +pkgrel=1 +_sfx='' +#_sfx='-pr1-998b758' +_HBB=( # dates are retrieved from git fetch; tig. Every version gets a specific hbb. + '1.3.7:20250120-49c6b24a7a8c39d4448e07b743007ef1a3febd43' + '1.3.8:20250223-7cf11f7b771e27ecbd14fd1dd0ced55a64f40eb5' + '1.3.9:20250328-81b932b7bfa2ff8bc60189625fd6538db2fa9ea1' + '1.4.0:20250509-6e556f7e1751a3a709cd5cca0df7268ba3cb1c48' + '1.4.1:20250718-f91459c4ab80fc3cfdef0882b2af51f984bc914c' + '1.4.2:20250904-9e7696c7d4e346508ba68e801a53c6d1f1748fb5' + '1.4.3:20251008-5ed0afde0841659e2fb37ae7acaddc005fa1a8d3' + '1.4.4:20251117-a86eda749e6fa33c282bab680e6b504d3ad87539' + '1.4.5:20251117-073403edbf1fffcb3acfe8cbe7582ee873b23398' + '1.4.6:20260302-48c37de3e6c4e399af6f51ca20e8e3e1fd037976' +) +_pkgverhbb="$(_fn_VCL "${_pkgver}" -eq "${_HBB[@]}")"; unset _HBB; test "$(_vercmp "${_pkgver}" '1.3.7')" -lt 0 -o ! -z "${_pkgverhbb}" || exit 1 +pkgdesc='Yet another remote desktop software, written in Rust. Works out of the box, no configuration required. Great alternative to TeamViewer and AnyDesk!' +arch=('x86_64') +url='https://rustdesk.com/' +_giturl='https://github.com/rustdesk/rustdesk' +_giturlhbb='https://github.com/rustdesk/hbb_common' +license=('AGPL-3.0-only') +_dpr=('gtk3' 'xdotool' 'libxcb' 'libxfixes' 'alsa-lib' 'libva' 'libappindicator-gtk3' 'pam' 'gst-plugins-base' 'gst-plugin-pipewire') # from res/PKGBUILD/depends +#_dpr=('gtk3' 'xdotool' 'libxcb' 'libxfixes' 'alsa-lib' 'libva' 'libvdpau' 'libappindicator-gtk3' 'pam' 'gst-plugins-base' 'gst-plugin-pipewire') # from res/PKGBUILD/depends +depends=("${_dpr[@]}" 'pulse-native-provider' 'gst-plugins-base-libs') +depends+=('hicolor-icon-theme' 'xdg-utils') +depends+=('xdg-user-dirs') +depends+=('glibc' 'gcc-libs' 'glib2' 'libxtst' 'libepoxy' 'gdk-pixbuf2' 'cairo' 'at-spi2-core' 'dbus' 'gstreamer' 'pango' 'libx11' 'fontconfig' 'libxkbcommon' 'libpulse') +_mdp=('unzip' 'git' 'cmake' 'gcc' 'curl' 'wget' 'yasm' 'nasm' 'zip' 'make' 'pkg-config' 'clang') # from Readme.MD +makedepends=("${_mdp[@]}" 'rust' 'python' 'python-yaml' 'python-toml') +makedepends+=('ninja' 'patchelf') # 'meson' 'pkgconf' # vcpkg makedepends are found in clean chroot. Some tools cmake always uses its own. +if [ ! -z "${_opt_CLANG}" ] && [[ "${_opt_CLANG}" != '+'* ]]; then + makedepends+=("clang${_opt_CLANG}") +fi +_fn_hwcodec "${_pkgver}" # makedepends +if [ "${#_opt_hwcodec_py[@]}" -gt 0 ]; then + optdepends=( # lifted from libva::PKGBUILD + 'intel-media-driver: h264 h265/HEVC support for Intel Quick Sync GPUs (>= Broadwell)' + 'libva-intel-driver: h264 support for Intel Quick Sync GPUs (<= Haswell)' + 'libva-mesa-driver: h264 h265/HEVC support for AMD and NVIDIA GPUs' + 'libva-utils: vainfo query codec support' + ) +fi +options=('!lto') +_patches=( + '0000-disable-update-check@rustdesk.patch' + #'0001-extended_text-drop-version-for-flutter.3.22.3@rustdesk.patch' # https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/bridge.yml#L77 + '0002-screen_retriever@rustdesk.patch' + '0004-bindgen@rustdesk.patch' # kevinlpowell +) +install="${pkgname}.install" +_srcdir="${pkgname}-${_pkgver}" +source=( + "${_srcdir}${_sfx}.tar.gz::${_giturl}/archive/refs/tags/${_pkgver}.tar.gz" + "${_patches[@]}" + '0003-mkvparser.cc-cstdint.patch' +) +if [ ! -z "${_pkgverhbb}" ]; then + _srcdirhb="hbb_common-${_pkgverhbb##*-}" + source=("${source[0]}" "hbb_common-${_pkgverhbb}.tgz::${_giturlhbb}/archive/${_pkgverhbb##*-}.tar.gz" "${source[@]:1}") +fi +unset _pkgverhbb +_vcs=( +) +_srcdirvc='vcpkg' +if :; then + _VCL=( + '1.2.7:#commit=20240614-f7423ee180c4b7f40d43402c2feb3859161ef625' # last version that worked with hwcodec + '1.3.0:#commit=20240712-1de2026f28ead93ff1773e6e680387643e914ea1' + '1.3.6:#commit=20241115-b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c' + '1.3.8:#commit=20250113-6f29f12e82a8293156836ad81cc9bf5af41fe836' + '1.4.2:#commit=20250827-120deac3062162151622ca4860575a33844ba10b' # date comes from commit (tig) + ) + _opt_VCPKG_COMMIT_ID="$(_fn_VCL "${_pkgver}" -ge "${_VCL[@]}")"; unset _VCL + #source+=("git+https://github.com/microsoft/vcpkg${_opt_VCPKG_COMMIT_ID}") + _srcdirvc="vcpkg-${_opt_VCPKG_COMMIT_ID##*-}" + source+=("vcpkg-${_opt_VCPKG_COMMIT_ID##*=}.tgz::https://github.com/microsoft/vcpkg/archive/${_opt_VCPKG_COMMIT_ID##*-}.tar.gz") + _meaver='1.8.2' + _pcfver='2.5.1' + _aomver='10aece4157eb79315da205f39e19bf6ab3ee30d0' + _jpgver='3.1.1' + _yuvver='0faf8dd0e004520a61a603a4d2996d5ecc80dc3f' + _wbmver='1.15.2' + _xipver='1.5.2' + _vcs+=( + "meson-${_meaver}.tar.gz::https://github.com/mesonbuild/meson/archive/refs/tags/${_meaver}.tar.gz" # meason and pkgconf versions are found in clean chroot + "pkgconf-pkgconf-pkgconf-${_pcfver}.tar.gz::https://github.com/pkgconf/pkgconf/archive/refs/tags/pkgconf-${_pcfver}.tar.gz" + # If your download gets renamed and replaced, vcpkg hash checked and found it to be the wrong one. + # vcs sources are not hash checked. vcpkg doesn't use hash direct downloads like we do. vcpkg downloads with git and tars up, always with a different hash. + "aom-${_aomver}.tar.gz::https://aomedia.googlesource.com/aom/+archive/${_aomver}.tar.gz" + "libjpeg-turbo-libjpeg-turbo-${_jpgver}.tar.gz::https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/${_jpgver}.tar.gz" + "libyuv-${_yuvver}.tar.gz::https://chromium.googlesource.com/libyuv/libyuv/+archive/${_yuvver}.tar.gz" + "webmproject-libvpx-v${_wbmver}.tar.gz::https://github.com/webmproject/libvpx/archive/refs/tags/v${_wbmver}.tar.gz" + "xiph-opus-v${_xipver}.tar.gz::https://github.com/xiph/opus/archive/refs/tags/v${_xipver}.tar.gz" + ) + unset _meaver _pcfver _aomver _jpgver _yuvver _wbmver _xipver + if [ "${#_opt_hwcodec_vc[@]}" -ne 0 ]; then + _ffmver='7.1' + _vcs+=("ffmpeg-ffmpeg-n${_ffmver}.tar.gz::https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n${_ffmver}.tar.gz") + unset _ffmver + fi +fi +source+=("${_vcs[@]}") + _FLX=( + '1.2.7:3.19.6' + #'1.3.3:3.24.5' # flutter_rust_bridge won't build + '1.4.1:3.24.5' # 3.27.4 also works + ) + _FLUVER="$(_fn_VCL "${_pkgver}" -ge "${_FLX[@]}")"; unset _FLX # https://docs.flutter.dev/release/archive + if [ "${_opt_FVM_FLUTTER}" -eq 0 ]; then + source+=( + "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${_FLUVER}-stable.tar.xz" + ) + else + makedepends+=('fvm') + fi + if :; then + _FRBVER='1.80.1' + _srcdirfrb="flutter_rust_bridge-${_FRBVER}" + source+=( + "${_srcdirfrb}.tar.gz::https://github.com/fzyzcjy/flutter_rust_bridge/archive/refs/tags/v${_FRBVER}.tar.gz" + ) + fi +#### +md5sums=('7e97019ef5eb91cb62cbd5bf4ebec65d' + '5c2218c15c7912ffe9da8bba179763c5' + '6acc4b5b14befec55ef84006b60c7ff5' + 'a77a4586f30f77de2eed63e160b3a051' + '54a30a570a89caa701d9c0b139b39170' + '379cfba8479c2a92e05e3b855d1e6901' + '56b134202b1ea88389d24d1c99635f6a' + '7887064dc9ce1cf7ae1c869bacd8e27e' + '7745ca9bd6d05af8af0afd209375e209' + '9b056bb94ba70d6ec3f5901544239268' + '4cc83d985db61e64bfa352388bb447ec' + 'f2f3868524b82915da3700267d116cdf' + '4c7a93808c12b359733430c8377b7fcf' + '557a08d88aa605ee6cf4156686ce4cc2' + '03485098fb64a000a4f7cd97e468dfff' + 'a3efc04e00cede00296f1a0dc323e8d1' + 'cc8e5418ff0c163228aabbe385ba2596') +sha256sums=('d0004f3880c19aefe2713696f0147efa03fdba5c566a39236b95820a4f24c0d0' + '8c5f064135b257e627b7b2ef25c27f746ef9ed57489ae93b58c39251b1858a63' + '8f7f1019404ce47dc012ba7c546ad634b973452fc2c57ac64b62cdc7c1f54ea3' + '82757ee1ab6b956a3c601f7db82e2d9ad80dbbcf2ba68c63059f0b529426ccd0' + '976944c6c163ed0810207f54bb4b5d5cf41aa4e4673133f188e0b0ada5eafc8e' + '359046f24f8a81b96a198000a1cfd7934c1f4870b2a1306e13f65694cefef68f' + 'f3b1ec711fa1ba291efd75e27983898a37be15760dfe129a406448fa7377b31d' + '6b878fb0f6f0318cbd54e13539f89a1a8305791668e8e93ffd59d82722888dac' + '79721badcad1987dead9c3609eb4877ab9b58821c06bdacb824f2c8897c11f2a' + '2399c0f128ef148a785c139d631a204458b1715bb2cfb54acc65613c22d89d5c' + '304165ae11e64ab752e9cfc07c37bfdc87abd0bfe4bc699e59f34036d9c84f72' + '73a4ecb598cd6824cb7a0a0d934d81b866e2762acd8eb465e1510063b4649659' + '26fcd3db88045dee380e581862a6ef106f49b74b6396ee95c2993a260b4636aa' + '9480e329e989f70d69886ded470c7f8cfe6c0667cc4196d4837ac9e668fb7404' + '7ddad2d992bd250a6c56053c26029f7e728bebf0f37f80cf3f8a0e6ec706431a' + 'a7c82f551a9eae018e078f6bb186171e5a77920d35a3d75a61d9a593d0a9e4ae' + '5c1494e79024de228a9f383c8e52e45b042cd0cf24f4b0f47ee4d5448938b336') +_vcs=("${_vcs[@]%%::*}") +_vcs=("${_vcs[@]##*/}") +noextract=("${_vcs[@]}") + +if ! :; then + _srcdir="${_pkgname}" + source[0]="git+${_giturl}#tag=${_pkgver}" +fi + +# updpkgsums now uses hashes for git commits, which are different than the git commit hashes. We want the original behavior SKIP. +# googlesource commit direct downloads do not have consistent hashes +for _fk in "${!source[@]}"; do + if [ "${source[${_fk}]#git}" != "${source[${_fk}]}" ] || [ "${source[${_fk}]/googlesource/}" != "${source[${_fk}]}" ]; then + md5sums["${_fk}"]='SKIP' + sha256sums["${_fk}"]='SKIP' + fi +done +unset _fk + +_vcpkg=(libvpx libyuv opus aom) + +_prepare_vc() { + local - + msg '_prepare_vc' + set -u + mkdir -p "${_srcdirvc}/downloads" + if [ "${#_vcs[@]}" -gt 0 ]; then + cp -p "${_vcs[@]}" "${_srcdirvc}/downloads" + fi + + # Check commit ID + if :; then # [ ! -z "${_opt_VCPKG_COMMIT_ID}" ]; then + local _vcc + local _pyvcc=" +import yaml +import io +with open('${_srcdir}/.github/workflows/flutter-build.yml', 'r') as stream: + data_loaded = yaml.safe_load(stream) +#print(data_loaded.get('env').keys()) +print(data_loaded.get('env').get('VCPKG_COMMIT_ID')) +" + _vcc="$(python -c "${_pyvcc}")" + if [ "${_vcc}" != "${_opt_VCPKG_COMMIT_ID##*-}" ]; then + echo "Flag package out of date: _opt_VCPKG_COMMIT_ID must be changed to (date)-${_vcc}" + set +u + false + fi + fi + + local _vcpkgnew + _vcpkgnew="$(sed -E -n -e '/Linux.+: vcpkg / s:^.+install ::p' "${_srcdir}/README.md")" + if [ "${_vcpkg[*]}" != "${_vcpkgnew}" ]; then + printf 'Flag package out of date: _vcpkg=(%s)\n' "${_vcpkgnew}" + set +u + false + fi +} + +# Same elements in same order +_dpr_check() { + local - + msg '_dpr_check' + set -u + pushd "${_srcdir}" > /dev/null + ( + source 'res/PKGBUILD' + if [ "${#_dpr[@]}" -ne "${#depends[@]}" ]; then + echo 'Flag package out of date: Update _dpr from res/PKGBUILD/depends=()' + false + fi + for((f=0; f<"${#_dpr[@]}"; f++)); do + if [ "${_dpr[f]}" != "${depends[f]}" ]; then + echo 'Flag package out of date: Update _dpr from res/PKGBUILD/depends=()' + set +u + false + fi + done + ) + popd > /dev/null +} + +_flutter_check() { + local - + set +u; msg '_flutter_check'; set -u + pushd "${_srcdir}" + local _FLUTTER_VERSION + local _pyfv=" +import yaml +import io +with open('.github/workflows/flutter-build.yml', 'r') as stream: +#with open('.github/workflows/bridge.yml', 'r') as stream: + data_loaded = yaml.safe_load(stream) +#print(data_loaded.get('env').keys()) +print(data_loaded.get('env').get('FLUTTER_VERSION')) +" + _FLUTTER_VERSION="$(python -c "${_pyfv}")" + if [ "${_FLUTTER_VERSION}" != "${_FLUVER}" ]; then + if [ "${_opt_FVM_FLUTTER}" -ne 0 ]; then + set +u; msg2 "Warning: expected Flutter version is ${_FLUTTER_VERSION}"; set -u + _FLUTTER_VERSION="${_FLUVER}" + else + printf 'Flutter version has changed to %s from %s\n' "${_FLUTTER_VERSION}" "${_FLUVER}" + set +u + false + fi + fi + set +u; msg2 "FLUTTER_VERSION=${_FLUTTER_VERSION}"; set -u + local _flutter_rust_bridge + local _pyfrb=" +import toml +new_toml_string = toml.load('Cargo.toml') +#print(new_toml_string.keys()) +print(new_toml_string.get('dependencies').get('flutter_rust_bridge').get('version')) +" + local _pyfrb=" +import yaml +import io +with open('.github/workflows/bridge.yml', 'r') as stream: + data_loaded = yaml.safe_load(stream) +#print(data_loaded.get('env').keys()) +print(data_loaded.get('env').get('FLUTTER_RUST_BRIDGE_VERSION')) +" + _flutter_rust_bridge="$(python -c "${_pyfrb}")" + _flutter_rust_bridge="${_flutter_rust_bridge#=}" + if [ "$(vercmp "${_flutter_rust_bridge}" "${_FRBVER%.0}")" -gt 0 ]; then + printf 'flutter_rust_bridge version has changed to %s from %s\n' "${_flutter_rust_bridge}" "${_FRBVER}" + set +u + false + fi + set +u; msg2 "flutter_rust_bridge=${_flutter_rust_bridge}"; set -u + popd +} + +_mod_py() { + local - + if [ "$(grep -c -F -e 'os.system' 'build.py')" -gt 1 ]; then + local _lf=$'\n' + local _nc=' +def systemecho(cmd): + print(cmd) + return os.system(cmd) + +' + _nc="${_nc//${_lf}/\\n}" + sed -e '# echo all system commands' \ + -e 's:os.system:systemecho:g' \ + -e "s/^def get_version/${_nc}&/g" \ + -e '# Disable makepkg' \ + -e 's:makepkg:true &:g' \ + -e '/pkg.tar.zst/ s:mv:true &:g' \ + -i 'build.py' + fi + if [ "${source[0]#git}" = "${source[0]}" ]; then + sed -e 's:git checkout:true &:g' -i 'build.py' + fi +} + +_fn_setvars() { + _FVC="${SRCDEST}/fvm-cache" # Default cache folder for fvm-3.2.1 is ~/fvm, not ~/.fvm as you'd expect and the docs seem to indicate. + _FBIN="${srcdir}/flutterbin" +} + +prepare() { + local - + _dpr_check + #rm -rf ~/'.cache/vcpkg/archives' ~/'.vcpkg' + _prepare_vc + pushd "${_srcdir}/res/vcpkg" > /dev/null + cp -pr . "${srcdir}/${_srcdirvc}/ports/" # the default vcpkg::ffmpeg build does not produce the correct libraries or codecs libavcodec.a libavutil.a libavformat.a. Use Rustdesk mods + popd > /dev/null + set -u + _flutter_check + local _FVC _FBIN; _fn_setvars + if [ "${_opt_FVM_FLUTTER}" -ne 0 ]; then + set +u; msg2 "fvm cache to ${_FVC}"; set -u + FVM_CACHE_PATH="${_FVC}" \ + fvm install "${_FLUVER}" + ln -s "${_FVC}/versions/${_FLUVER}" 'flutter' + fi + if [ ! -d 'flutter_rust_bridge' ]; then + ln -s "flutter_rust_bridge-${_FRBVER}" 'flutter_rust_bridge' + test -d 'flutter_rust_bridge' + fi + mkdir -p "${_FBIN}" + pushd "${_FBIN}" + cat > 'flutter' << EOF +#!/usr/bin/bash + +# https://github.com/flutter/flutter/issues/59533 +# Gets rid of all the unnecessary downloads + +_FBIN="${_FBIN}" +export PATH="\${PATH/\${_FBIN}:/}" + +echo '#flutter --no-version-check' "\$@" +${srcdir}/flutter/bin/flutter --no-version-check "\$@" +EOF + chmod 755 'flutter' + cat > 'dart' << EOF +#!/usr/bin/bash + +# dart doesn't do a version check. Let's reveal the commands. + +_FBIN="${_FBIN}" +export PATH="\${PATH/\${_FBIN}:/}" + +echo '#dart' "\$@" +${srcdir}/flutter/bin/dart "\$@" +EOF + chmod 755 'dart' + popd + + cd "${_srcdir}" + _mod_py + if rmdir 'libs/hbb_common'; then + pushd 'libs' > /dev/null + test -d "${srcdir}/${_srcdirhb}" + ln -sr "${srcdir}/${_srcdirhb}" 'hbb_common' + popd > /dev/null + fi + + local _pt _ptf=() _pts=() _ptd + for _pt in "${_patches[@]}"; do + set +u; msg2 "Patch ${_pt}"; set -u + _ptd=() + if [[ "${_pt}" =~ ^[^@]+@([^.]+).patch$ ]]; then + case "${BASH_REMATCH[1]}" in + 'rustdesk') _ptd=(-d "${srcdir}/${_srcdir}");; + 'flutter_rust_bridge') _ptd=(-d "${srcdir}/${_srcdirfrb}");; + 'vcpkg') _ptd=(-d "${srcdir}/${_srcdirvc}") ;; + *) _ptd=(-d "${srcdir}/${BASH_REMATCH[1]}");; + esac + fi + if patch "${_ptd[@]}" -Nup1 -i "${srcdir}/${_pt}"; then + _pts+=("${_pt}") + else + _ptf+=("${_pt}") + fi + done + if [ "${#_ptf[@]}" -gt 0 ]; then + if [ "${#_pts[@]}" -gt 0 ]; then + printf 'Patch success %s\n' "${_pts[@]}" + printf 'Warning: Some old patches may need to be removed even if they are successful\n' + fi + printf 'Patch failed %s\n' "${_ptf[@]}" + set +x + false + fi + #cd '..'; cp -pr "${_srcdir}" 'a'; ln -s "${_srcdir}" 'b'; cp -pr "${_srcdirfrb}" 'fa'; ln -s "${_srcdirfrb}" 'fb'; false + #cd '..'; cp -pr "${_srcdirvc}" 'va'; ln -s "${_srcdirvc}" 'vb'; false + #diff -pNaru5 'a' 'b' > "0000-$RANDOM@domain.patch" +} + +build() { + local - + msg2 'Build vcpkg' + set -u + unset VCPKG_DOWNLOADS + if [ ! -x "${_srcdirvc}/vcpkg" ]; then + "${_srcdirvc}/bootstrap-vcpkg.sh" -disableMetrics + fi + export VCPKG_ROOT="${PWD}/${_srcdirvc}" + local _vcextra=( + --disable-metrics + --cmake-args='-DVCPKG_BUILD_TYPE=release' # https://github.com/microsoft/vcpkg/issues/37186#issuecomment-2133951797 + --cmake-args='-DVCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES=enabled' + #--no-downloads + #--only-downloads + ) + #export CMAKE_POLICY_VERSION_MINIMUM='3.5' + ${_opt_NICE} "${_srcdirvc}/vcpkg" install "${_vcextra[@]}" --x-install-root="${VCPKG_ROOT}/installed" "${_vcpkg[@]}" "${_opt_hwcodec_vc[@]}" + + cd "${_srcdir}" + set +u; msg2 'Build rustdesk Flutter'; set -u + _fn_setclang + set -x + export CPATH="$(clang -v 2>&1 | grep "Selected GCC installation: " | cut -d' ' -f4-)/include" + export CARGO_INCREMENTAL=0 + local _FVC _FBIN; _fn_setvars + export PATH="${_FBIN}:${srcdir}/flutter/bin:${PATH}" + flutter --disable-analytics + dart --disable-analytics + flutter doctor + dart pub global activate ffigen --version 5.0.1 + pushd "${srcdir}/flutter_rust_bridge/frb_codegen"; ${_opt_NICE} cargo install --path . ; popd + pushd flutter ; flutter clean; flutter pub get ; popd + local _CGdefault=~/.cargo + local _CARGO_HOME_RUSTDESK="${CARGO_HOME:-${_CGdefault}}" + "${_CARGO_HOME_RUSTDESK}"/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart + if :; then + find "${_CARGO_HOME_RUSTDESK}/git" -type 'f' -name 'mkvparser.cc' -execdir sh -c "patch --no-backup-if-mismatch -Nup0 -i \"${srcdir}/0003-mkvparser.cc-cstdint.patch\"; rm -f mkvparser.cc.rej; true" ';' + fi + if [ "${_opt_BUILD_PY}" -ne 0 ]; then + ${_opt_NICE} ./build.py --flutter "${_opt_hwcodec_py[@]}" + else + #git checkout src/ui/common.tis + ${_opt_NICE} cargo build --features flutter${_opt_hwcodec_fe} --lib --release + pushd flutter + ${_opt_NICE} flutter build linux --release + popd + fi + set +x +} + +# This rebuilds the entire package +check_disabled() { + cd "${_srcdir}" + ${_opt_NICE} cargo test --release +} + +package() { + local - + set -u + cd "${_srcdir}" + + install -d "${pkgdir}/usr/lib/" + cp -pr 'flutter/build/linux/x64/release/bundle' "${pkgdir}/usr/lib/" + mv "${pkgdir}/usr/lib/"{bundle,${_pkgname}} + install -d "${pkgdir}/usr/bin/" + ln -s -t "${pkgdir}/usr/bin/" "/usr/lib/${_pkgname}/${_pkgname}" + + install -Dm0644 "res/${_pkgname}.service" -t "${pkgdir}/usr/lib/systemd/system/" + + install -Dm0644 'res/32x32.png' "${pkgdir}/usr/share/icons/hicolor/32x32/apps/${_pkgname}.png" + install -Dm0644 'res/128x128.png' "${pkgdir}/usr/share/icons/hicolor/128x128/apps/${_pkgname}.png" + install -Dm0644 'res/128x128@2x.png' "${pkgdir}/usr/share/icons/hicolor/256x256/apps/${_pkgname}.png" + + install -Dm0644 /dev/stdin "${pkgdir}/usr/share/applications/${_pkgname}.desktop" << EOF +[Desktop Entry] +Version=${pkgver%.r*} +Name=RustDesk +GenericName=Remote Desktop +GenericName[zh_CN]=远程桌面 +Comment=Remote Desktop +Comment[zh_CN]=远程桌面 +Exec=${_pkgname} %u +Icon=${_pkgname} +Terminal=false +Type=Application +MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https; +StartupNotify=true +Categories=Network;RemoteAccess;GTK; +Keywords=internet; +Actions=new-window; + +X-Desktop-File-Install-Version=0.23 + +[Desktop Action new-window] +Name=Open a New Window +EOF + install -Dm644 'LICENCE' -t "${pkgdir}/usr/share/licenses/${_pkgname}" +} +set +u diff --git a/pkgbuilds/rustdesk/rustdesk.install b/pkgbuilds/rustdesk/rustdesk.install new file mode 100644 index 0000000..08f815c --- /dev/null +++ b/pkgbuilds/rustdesk/rustdesk.install @@ -0,0 +1,15 @@ +# arg 1: the new package version +post_install() { + if systemctl -q is-enabled 'rustdesk.service'; then + systemctl daemon-reload + systemctl restart 'rustdesk.service' + fi +} + +# arg 1: the new package version +# arg 2: the old package version +post_upgrade() { + if systemctl -q is-enabled 'rustdesk.service'; then + systemctl restart 'rustdesk.service' + fi +}