Windows

Dependencies

C++ build environment

Download msvc and install.

Rust develop environment

Download rustup-init.exe and install.

vcpkg

Use git-bash to run the following commands, download vcpkg, install libvpx, libyuv, opus.

  git clone https://github.com/microsoft/vcpkg
  cd vcpkg
  git checkout 2021.12.01
  cd ..
  vcpkg/bootstrap-vcpkg.bat
  export VCPKG_ROOT=$PWD/vcpkg
  vcpkg/vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static

Add environment variable VCPKG_ROOT=<path>\vcpkg.

sciter

Desktop versions use sciter for GUI, please download sciter.dll

llvm

rust-bindgen depends on clang, download llvm and install,add environment variable LIBCLANG_PATH=<llvm_install_dir>/bin.

Build

Default

git clone https://github.com/rustdesk/rustdesk
cd rustdesk
mkdir -p target/debug
mv sciter.dll target/debug
cargo run

Pack resource files

Rustdesk can pack resource files in one exe file. Then extract files to the installation directory when being installed.

This design makes rustdesk run both simple mode(single exe file) and full mode(all files after been installed).

To pack resource files, follow the steps:

  1. cd rustdesk
  2. mkdir resources directory
  3. put files to resources
  4. cargo build –features with_rc,

Feature with_rc is introduced to pack and extract resource files.

Lib simple_rc

A lib named simple_rc is used to pack and extract resource files.

Generate resource packed file

The pack process workflow:

  1. Parse the specified directory tree.
  2. Exclude specified files.
  3. Read all file contents, save as byte arrays in source file(rc.rs), and remember file names.

simple_rc accepts either a configuration file or a Config structure.

  1. Generate resource packed with configuration file.
fn generate(conf_file: &str) -> ResultType<()>
# The output source file
outfile = "src/rc.rs"

# The resource config list.
[[confs]]
# The file or director to integrate.
inc = "D:/projects/windows/RustDeskTempTopMostWindow/x64/Release/xxx"
# The exclusions.
exc = ["*.dll", "*.exe"]
# The front path that will ignore for extracting.
# ${OutputPath} = ${InstallDir} + (${inc} - ${suppressed_front})
# The following config will make base output path to be "RustDeskTempTopMostWindow/x64/Release/xxx".
suppressed_front = "D:/projects/windows"
  1. Generate resource packed file with a Config structure:
fn generate_with_conf<'a>(conf: &'a Config) -> ResultType<()>

...
    generate_with_conf(&Config {
        outfile: "src/rc.rs".to_owned(),
        confs: vec![ConfigItem {
            inc: "resources".to_owned(),
            exc: vec![],
            suppressed_front: "resources".to_owned(),
        }],
    })
    .unwrap();
...
Extract files

Extraction will keep the resource direcotry tree.

The extraction process workflow:

  1. Create directory if needed, to restore the directory tree.
  2. Write contents to the associated file names.
fn extract_resources(root_path: &str) -> ResultType<()>
Note

File attributes like privileges, create time, owner, are not supported.