rustdesk-build@constitution:~$ ls -sal
total 8
4 drwx------ 2 rustdesk-build rustdesk-build 4096 Aug 5 10:00 .
4 drwxr-xr-x 10 root root 4096 Aug 5 09:48 ..
rustdesk-build@constitution:~$
logout
troy@constitution:~$ sudo su - rustdesk-build
rustdesk-build@constitution:~$ git clone --recurse-submodules https://github.com/microsoft/vcpkg
Cloning into 'vcpkg'...
remote: Enumerating objects: 334526, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 334526 (delta 4), reused 5 (delta 0), pack-reused 334509 (from 1)
Receiving objects: 100% (334526/334526), 108.01 MiB | 11.46 MiB/s, done.
Resolving deltas: 100% (222957/222957), done.
rustdesk-build@constitution:~$ cd vcpkg
rustdesk-build@constitution:~/vcpkg$ git checkout 2023.10.19
Note: switching to '2023.10.19'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 8eb57355a4 add mips64-linux to triplets/community (#34392)
rustdesk-build@constitution:~/vcpkg$ cd ..
rustdesk-build@constitution:~$ vcpkg/bootstrap-vcpkg.sh
Downloading vcpkg-glibc...
vcpkg package management program version 2023-10-18-27de5b69dac4b6fe8259d283cd4011e6d20a84ce
See LICENSE.txt for license information.
Telemetry
---------
vcpkg collects usage data in order to help us improve your experience.
The data collected by Microsoft is anonymous.
You can opt-out of telemetry by re-running the bootstrap-vcpkg script with -disableMetrics,
passing --disable-metrics to vcpkg on the command line,
or by setting the VCPKG_DISABLE_METRICS environment variable.
Read more about vcpkg telemetry at docs/about/privacy.md
rustdesk-build@constitution:~$ export VCPKG_ROOT=$PWD/vcpkg
rustdesk-build@constitution:~$ vcpkg/vcpkg install --x-install-root="$VCPKG_ROOT/installed"
error: `vcpkg install` requires a list of packages to install in classic mode.
Synopsis: Installs a package
Examples:
vcpkg install <port name> <port name>...
vcpkg install zlib zlib:x64-windows curl boost
See https://learn.microsoft.com/vcpkg/commands/install for more information.
Options:
--allow-unsupported Continues with a warning on unsupported ports, rather than failing
--x-asset-sources=... Asset caching sources. See 'vcpkg help assetcaching'
--binarysource=... Binary caching sources. See 'vcpkg help binarycaching'
--x-buildtrees-root=...
Buildtrees directory (experimental)
--clean-after-build Cleans buildtrees, packages and downloads after building each package
--clean-buildtrees-after-build
Cleans buildtrees after building each package
--clean-downloads-after-build
Cleans downloads after building each package
--clean-packages-after-build
Cleans packages after building each package
--downloads-root=... Downloads directory (default: $VCPKG_DOWNLOADS)
--dry-run Does not actually build or install
--editable Disables source re-extraction and binary caching for libraries on the
command line (classic mode)
--enforce-port-checks Fails install if a port has detected problems or attempts to use a
deprecated feature
--x-feature=... Additional features from the top-level manifest to install (manifest mode)
--head Installs the libraries on the command line using the latest upstream
sources (classic mode)
--host-triplet=... Host triplet. See 'vcpkg help triplet' (default:
$VCPKG_DEFAULT_HOST_TRIPLET)
--x-install-root=... Installed directory (experimental)
--keep-going Continues installing packages on failure
--x-no-default-features
Does not install the default features from the top-level manifest (manifest
mode)
--no-downloads Does not download new sources
--no-print-usage Does not print CMake usage information after install
--only-binarycaching Fails if cached binaries are not available
--only-downloads Makes best-effort attempt to download sources without building
--overlay-ports=... Directories of overlay ports (also: $VCPKG_OVERLAY_PORTS)
--overlay-triplets=... Directories of overlay triplets (also: $VCPKG_OVERLAY_TRIPLETS)
--x-packages-root=... Packages directory (experimental)
--recurse Allows removal of packages as part of installation
--triplet=... Target triplet. See 'vcpkg help triplet' (default: $VCPKG_DEFAULT_TRIPLET)
--x-use-aria2 Uses aria2 to perform download tasks
--vcpkg-root=... The vcpkg root directory (default: $VCPKG_ROOT)
--x-write-nuget-packages-config=...
Writes a NuGet packages.config-formatted file for use with external binary
caching. See `vcpkg help binarycaching` for more information
rustdesk-build@constitution:~$
First work-around attempt was to adjust that command to give it something to install:
rustdesk-build@constitution:~$ vcpkg/vcpkg install --x-install-root="$VCPKG_ROOT/installed" libvpx libyuv opus aom
Computing installation plan...
...
This results in the named packages being installed/built without error. Moving on to the next section:
rustdesk-build@constitution:~$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer
warn: It looks like you have an existing installation of Rust at:
warn: /usr/bin
warn: It is recommended that rustup be the primary Rust installation.
warn: Otherwise you may have confusion unless you are careful with your PATH.
warn: If you are sure that you want both rustup and your already installed Rust
warn: then please reply `y' or `yes' or set RUSTUP_INIT_SKIP_PATH_CHECK to yes
warn: or pass `-y' to ignore all ignorable checks.
error: cannot install while Rust is installed
Continue? (y/N) y
warn: It looks like you have an existing rustup settings file at:
warn: /home/rustdesk-build/.rustup/settings.toml
warn: Rustup will install the default toolchain as specified in the settings file,
warn: instead of the one inferred from the default host triple.
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:
/home/rustdesk-build/.rustup
This can be modified with the RUSTUP_HOME environment variable.
The Cargo home directory is located at:
/home/rustdesk-build/.cargo
This can be modified with the CARGO_HOME environment variable.
The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:
/home/rustdesk-build/.cargo/bin
This path will then be added to your PATH environment variable by
modifying the profile files located at:
/home/rustdesk-build/.profile
/home/rustdesk-build/.zshenv
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>
info: profile set to default
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for stable-x86_64-unknown-linux-gnu
info: latest update on 2026-07-16 for version 1.97.1 (8bab26f4f 2026-07-14)
info: downloading 6 components
cargo installed 10.63 MiB
clippy installed 4.71 MiB
rust-docs installed 22.73 MiB
rust-std installed 28.71 MiB
rustc installed 77.30 MiB
rustfmt installed 2.06 MiB info: default toolchain set to stable-x86_64-unknown-linux-gnu
stable-x86_64-unknown-linux-gnu installed - rustc 1.97.1 (8bab26f4f 2026-07-14)
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.
This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env" # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish" # For fish
source "~/.cargo/env.nu" # For nushell
source "$HOME/.cargo/env.tcsh" # For tcsh
. "$HOME/.cargo/env.ps1" # For pwsh
source "$HOME/.cargo/env.xsh" # For xonsh
rustdesk-build@constitution:~$ . "$HOME/.cargo/env"
rustdesk-build@constitution:~$ git clone --recurse-submodules https://github.com/rustdesk/rustdesk
Cloning into 'rustdesk'...
remote: Enumerating objects: 86428, done.
remote: Counting objects: 100% (167/167), done.
remote: Compressing objects: 100% (135/135), done.
remote: Total 86428 (delta 76), reused 32 (delta 32), pack-reused 86261 (from 3)
Receiving objects: 100% (86428/86428), 74.72 MiB | 11.46 MiB/s, done.
Resolving deltas: 100% (64652/64652), done.
Submodule 'libs/hbb_common' (https://github.com/rustdesk/hbb_common) registered for path 'libs/hbb_common'
Cloning into '/home/rustdesk-build/rustdesk/libs/hbb_common'...
remote: Enumerating objects: 1284, done.
remote: Counting objects: 100% (786/786), done.
remote: Compressing objects: 100% (72/72), done.
remote: Total 1284 (delta 747), reused 714 (delta 714), pack-reused 498 (from 2)
Receiving objects: 100% (1284/1284), 555.12 KiB | 6.94 MiB/s, done.
Resolving deltas: 100% (826/826), done.
Submodule path 'libs/hbb_common': checked out '69cea8dafee147848ae88702029f4bf7df7224c3'
rustdesk-build@constitution:~$ cd rustdesk
rustdesk-build@constitution:~/rustdesk$ mkdir -p target/debug
rustdesk-build@constitution:~/rustdesk$ wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
--2026-08-05 10:20:07-- https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8001::154, 2606:50c0:8002::154, 2606:50c0:8003::154, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|2606:50c0:8001::154|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10479944 (10.0M) [application/octet-stream]
Saving to: ‘libsciter-gtk.so’
libsciter-gtk.so 100%[=====================================================================================================>] 9.99M 11.3MB/s in 0.9s
2026-08-05 10:20:08 (11.3 MB/s) - ‘libsciter-gtk.so’ saved [10479944/10479944]
rustdesk-build@constitution:~/rustdesk$ mv libsciter-gtk.so target/debug
rustdesk-build@constitution:~/rustdesk$ cargo run
Updating crates.io index
Updating git repository `https://github.com/rustdesk-org/hwcodec`
remote: Enumerating objects: 2825, done.
remote: Counting objects: 100% (637/637), done.
remote: Compressing objects: 100% (211/211), done.
remote: Total 2825 (delta 547), reused 426 (delta 426), pack-reused 2188 (from 2)
Receiving objects: 100% (2825/2825), 7.91 MiB | 11.16 MiB/s, done.
Resolving deltas: 100% (1509/1509), done.
From https://github.com/rustdesk-org/hwcodec
* [new ref] 778df1f99597722473b29443bac22ae6c23946fe -> refs/commit/778df1f99597722473b29443bac22ae6c23946fe
Updating git submodule `https://github.com/rustdesk-org/externals.git`
...
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 14s
Running `target/debug/rustdesk`
thread 'main' (3202716) panicked at /home/rustdesk-build/.cargo/git/checkouts/rust-sciter-9d95e9099df4ba27/5322f3a/src/capi/scdef.rs:160:14:
trying to construct an enum from an invalid value 0x84
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread caused non-unwinding panic. aborting.
Aborted
rustdesk-build@constitution:~/rustdesk$ echo $PATH
/home/rustdesk-build/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin
rustdesk-build@constitution:~/rustdesk$ which rustc
/home/rustdesk-build/.cargo/bin/rustc
rustdesk-build@constitution:~/rustdesk$
Attempting an alternative build with "./build.py --flutter" on a clean checkout of rustdesk also fails:
rustdesk-build@constitution:~/rustdesk$ ./build.py --flutter
features: ['flutter']
False
Downloaded atomic v0.5.3
Downloaded allo-isolate v0.1.25
Downloaded dart-sys v4.1.5
Downloaded build-target v0.4.0
...
Compiling rustdesk v1.4.9 (/home/rustdesk-build/rustdesk)
warning: `scrap` (lib) generated 5 warnings (run `cargo fix --lib -p scrap` to apply 2 suggestions)
warning: `hbb_common` (lib) generated 1 warning (run `cargo fix --lib -p hbb_common` to apply 1 suggestion)
error[E0583]: file not found for module `bridge_generated`
--> src/lib.rs:33:1
|
33 | mod bridge_generated;
| ^^^^^^^^^^^^^^^^^^^^^
|
= help: to create the module `bridge_generated`, create file "src/bridge_generated.rs" or "src/bridge_generated/mod.rs"
= note: if there is a `mod bridge_generated` elsewhere in the crate already, import it with `use crate::...` instead
warning: unused imports: `allow_err` and `anyhow`
--> src/server/wayland.rs:2:18
|
2 | use hbb_common::{allow_err, anyhow, platform::linux::DISTRO};
| ^^^^^^^^^ ^^^^^^
|
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
warning: unused import: `crate::clipboard_file::*`
--> src/server/connection.rs:12:5
|
12 | use crate::clipboard_file::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^
warning: unused import: `is_installed`
--> src/common.rs:42:69
|
42 | ui_interface::{get_api_server as ui_get_api_server, get_option, is_installed, set_option},
| ^^^^^^^^^^^^
warning: unused imports: `Duration` and `path::PathBuf`
--> src/flutter_ffi.rs:26:5
|
26 | path::PathBuf,
| ^^^^^^^^^^^^^
...
31 | time::{Duration, SystemTime},
| ^^^^^^^^
warning: unused import: `bail`
--> src/ui_cm_interface.rs:14:16
|
14 | allow_err, bail,
| ^^^^
warning: use of deprecated function `hbb_common::whoami::hostname`: use `fallible::hostname()` instead
--> src/platform/linux.rs:1750:47
|
1750 | .replace(&hbb_common::whoami::hostname(), "")
| ^^^^^^^^
|
= note: `#[warn(deprecated)]` on by default
warning: use of deprecated function `hbb_common::base64::encode`: Use Engine::encode
--> src/hbbs_http/sync.rs:187:52
|
187 | hash = hbb_common::base64::encode(&res[..]);
| ^^^^^^
error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
--> src/flutter.rs:591:28
|
591 | stream.add(EventToUI::Event(out.clone()));
| ^^^ unsatisfied trait bound
|
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
--> src/flutter_ffi.rs:95:1
|
95 | pub enum EventToUI {
| ^^^^^^^^^^^^^^^^^^
= help: the following other types implement trait `IntoIntoDart<D>`:
`()` implements `IntoIntoDart<()>`
`(A, B)` implements `IntoIntoDart<(AD, BD)>`
`(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
`(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
`(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
`DartCObject` implements `IntoIntoDart<DartCObject>`
`DartOpaque` implements `IntoIntoDart<DartOpaque>`
`NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
and 23 others
note: required by a bound in `StreamSink::<T>::add`
--> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
|
137 | pub fn add<D: IntoDart>(&self, value: T) -> bool
| --- required by a bound in this associated function
138 | where
139 | T: IntoIntoDart<D>,
| ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`
error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
--> src/flutter.rs:1239:24
|
1239 | stream.add(EventToUI::Rgba(display));
| ^^^ unsatisfied trait bound
|
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
--> src/flutter_ffi.rs:95:1
|
95 | pub enum EventToUI {
| ^^^^^^^^^^^^^^^^^^
= help: the following other types implement trait `IntoIntoDart<D>`:
`()` implements `IntoIntoDart<()>`
`(A, B)` implements `IntoIntoDart<(AD, BD)>`
`(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
`(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
`(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
`DartCObject` implements `IntoIntoDart<DartCObject>`
`DartOpaque` implements `IntoIntoDart<DartOpaque>`
`NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
and 23 others
note: required by a bound in `StreamSink::<T>::add`
--> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
|
137 | pub fn add<D: IntoDart>(&self, value: T) -> bool
| --- required by a bound in this associated function
138 | where
139 | T: IntoIntoDart<D>,
| ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`
error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
--> src/flutter.rs:1269:32
|
1269 | stream.add(EventToUI::Texture(display, false));
| ^^^ unsatisfied trait bound
|
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
--> src/flutter_ffi.rs:95:1
|
95 | pub enum EventToUI {
| ^^^^^^^^^^^^^^^^^^
= help: the following other types implement trait `IntoIntoDart<D>`:
`()` implements `IntoIntoDart<()>`
`(A, B)` implements `IntoIntoDart<(AD, BD)>`
`(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
`(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
`(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
`DartCObject` implements `IntoIntoDart<DartCObject>`
`DartOpaque` implements `IntoIntoDart<DartOpaque>`
`NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
and 23 others
note: required by a bound in `StreamSink::<T>::add`
--> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
|
137 | pub fn add<D: IntoDart>(&self, value: T) -> bool
| --- required by a bound in this associated function
138 | where
139 | T: IntoIntoDart<D>,
| ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`
error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
--> src/flutter.rs:1438:16
|
1438 | stream.add(EventToUI::Event("close".to_owned()));
| ^^^ unsatisfied trait bound
|
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
--> src/flutter_ffi.rs:95:1
|
95 | pub enum EventToUI {
| ^^^^^^^^^^^^^^^^^^
= help: the following other types implement trait `IntoIntoDart<D>`:
`()` implements `IntoIntoDart<()>`
`(A, B)` implements `IntoIntoDart<(AD, BD)>`
`(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
`(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
`(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
`DartCObject` implements `IntoIntoDart<DartCObject>`
`DartOpaque` implements `IntoIntoDart<DartOpaque>`
`NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
and 23 others
note: required by a bound in `StreamSink::<T>::add`
--> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
|
137 | pub fn add<D: IntoDart>(&self, value: T) -> bool
| --- required by a bound in this associated function
138 | where
139 | T: IntoIntoDart<D>,
| ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`
warning: variable does not need to be mutable
--> src/flutter_ffi.rs:1045:9
|
1045 | let mut map: HashMap<String, String> = serde_json::from_str(&json).unwrap_or(HashMap::new());
| ----^^^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
warning: variable does not need to be mutable
--> src/tray.rs:155:17
|
155 | let mut builder = TrayIconBuilder::new()
| ----^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/tray.rs:63:9
|
63 | let mut event_loop = EventLoopBuilder::new().build();
| ----^^^^^^^^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/privacy_mode.rs:140:13
|
140 | let mut map: HashMap<&'static str, PrivacyModeCreator> = HashMap::new();
| ----^^^
| |
| help: remove this `mut`
Some errors have detailed explanations: E0277, E0583.
For more information about an error, try `rustc --explain E0277`.
warning: `rustdesk` (lib) generated 11 warnings
error: could not compile `rustdesk` (lib) due to 5 previous errors; 11 warnings emitted
Error occurred when executing: `cargo build --locked --features flutter --lib --release`. Exiting.
rustdesk-build@constitution:~/rustdesk$
Attempting to open a discussion in the development forum about this is entirely unproductive - they get almost immediately shut down with a comment linking to rustdesk/rustdesk#763, which ultimately references the non-working instructions at https://rustdesk.com/docs/en/dev/build/linux/
Following the English language build instructions at https://rustdesk.com/docs/en/dev/build/linux/ using a new account with an empty home directory on Linux (Debian Trixie) does not work. Initially it returns an error on the last "vcpkg" command:
First work-around attempt was to adjust that command to give it something to install:
This results in the named packages being installed/built without error. Moving on to the next section:
PATH and "which rustc" seem correct:
Attempting an alternative build with "./build.py --flutter" on a clean checkout of rustdesk also fails:
Attempting to open a discussion in the development forum about this is entirely unproductive - they get almost immediately shut down with a comment linking to rustdesk/rustdesk#763, which ultimately references the non-working instructions at https://rustdesk.com/docs/en/dev/build/linux/