Files
rustdesk-custom/docs/CODEMAP.md
T
gusadmin 08321338d9 Добавить flutter_rust_bridge codegen перед сборкой
RustDesk не коммитит src/bridge_generated.rs -> cargo build падал
E0583/E0277. Встроил шаг codegen (FRB 1.80.1 + cargo-expand 1.0.95,
RUSTC_BOOTSTRAP=1) в build-windows.ps1; пины в upstream.txt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 15:09:39 +03:00

6.5 KiB
Raw Blame History

CODEMAP — rustdesk-custom

Карта overlay-репозитория для преднастроенной сборки RustDesk. Держать актуальной при каждом изменении.

Структура

Путь Назначение
upstream.txt Пины: RUSTDESK_TAG, версии Rust/LLVM/Flutter, VCPKG_COMMIT_ID, VCPKG_TRIPLET, Android-пины. Единственный источник версий.
scripts/preconfigure.sh Патчит RENDEZVOUS_SERVERS и RS_PUB_KEY в hbb_common/src/config.rs клона. Значения из env. Проверяет, что патч применился.
scripts/build-windows.ps1 Оркестратор локальной Windows-сборки: load env → клон@пин → preconfigure → python build.py --flutterdist/. Есть preflight тулчейна.
config/server.env.example Шаблон значений. Реальный config/server.env — в .gitignore.
.gitea/workflows/ CI: build-windows.yaml (раннер windows:host), build-android.yaml (VM 118). (в работе)
rustdesk/ Клон апстрима (gitignored, создаётся сборкой).
dist/ Готовые артефакты (gitignored).

Механизм преднастройки (важно)

RustDesk 1.4.9, libs/hbb_common/src/config.rs (сабмодуль rustdesk/hbb_common, пин 7e1c392):

pub const RENDEZVOUS_SERVERS: &[&str] = &["rs-ny.rustdesk.com"];
pub const RS_PUB_KEY: &str = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=";
  • option_env!(RENDEZVOUS_SERVER/RS_PUB_KEY) из старого PR #2810 в master вырезан — только патч констант.
  • Порт hbbs по умолчанию 21116 (не указывать, если стандартный). Нестандартный — host:port.
  • API-сервер (только RustDesk Server Pro) отдельной const в 1.4.9 не имеет; для обычного hbbs/hbbr не нужен.
  • Альтернатива без сборки (на будущее): переименовать официальный бинарь в rustdesk-host=<server>,key=<pubkey>.exe — конфиг читается из имени файла (EXE_RENDEZVOUS_SERVER).

Windows toolchain (поднять один раз на GUSIK-PC)

Версии — из upstream.txt (пины из flutter-build.yml@1.4.9):

  • Rust 1.75rustup toolchain install 1.75; в дереве клона rustup override set 1.75 (апстрим держит 1.75 из-за i128 ABI-изменения в 1.78+).
  • LLVM 15.0.6 — для bindgen; задать LIBCLANG_PATH на bin LLVM.
  • Flutter 3.24.5 (канал stable) в PATH. Апстрим применяет патч .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff к SDK — при ошибке сборки применить.
  • vcpkg@120deac3 — склонировать, bootstrap-vcpkg, задать VCPKG_ROOT. Триплет x64-windows-static. Зависимости из vcpkg.json: aom, libvpx, libyuv, opus, libjpeg-turbo, mfx-dispatch, ffmpeg (static, features amf/nvcodec/qsv — hwcodec). ffmpeg/aom — длинная первая компиляция.
  • Сборка: python build.py --flutter (флаги: --hwcodec, --portable, --vram, --skip-cargo).

Грабля: bridge_generated.rs (обязательный codegen)

RustDesk не коммитит src/bridge_generated.rs (lib.rs объявляет mod bridge_generated;). Без генерации cargo build падает: E0583 file not found for module bridge_generated + E0277 EventToUI: IntoIntoDart. Генерится flutter_rust_bridge_codegen (в CI RustDesk — отдельный bridge.yml):

cargo +stable install cargo-expand --version 1.0.95 --locked
cargo +stable install flutter_rust_bridge_codegen --version 1.80.1 --features uuid --locked
pushd flutter && flutter pub get && popd
RUSTC_BOOTSTRAP=1 flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs \
  --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h

Пины FRB_VERSION/CARGO_EXPAND_VERSION — в upstream.txt. Шаг встроен в build-windows.ps1 перед build.py. RUSTC_BOOTSTRAP=1 нужен, т.к. cargo-expand требует nightly-фич, а тулчейн 1.75 stable.

Открытый вопрос (решить при первой сборке)

Апстрим для Windows-x64 подменяет flutter-engine кастомным windows-x64-release.zip (ради Win7). Для таргета Win10/11, вероятно, можно оставить стоковый engine 3.24.5 и пропустить подмену — проверить, не падает ли flutter build windows без неё.

Android toolchain (VM 118, позже)

Flutter 3.24.5, NDK r28c, cargo-ndk 3.1.2, Rust android-таргеты, vcpkg android-триплеты (oboe, cpu-features, ffmpeg host=false). Публикация APK: gitea release + F-Droid (шаблон GusVoice).

Грабли: прокси и vcpkg (GUSIK-PC)

На машине в env задан NO_PROXY=...,192.168.5.0/24,... (CIDR). WinHTTP-загрузчик vcpkg (и bootstrap.ps1) не парсит CIDR → падает с WinHttpSetOption/WinHttpOpen error 87/0x57 на первом же скачивании (nasm и т.п.). У машины есть прямой интернет (netsh winhttp = Direct, HEAD к nasm.us = 200), поэтому build-windows.ps1 очищает HTTP(S)_PROXY/NO_PROXY для процесса сборки — качается напрямую. vcpkg.exe тоже качали вручную через IWR (bootstrap не смог) — лежит в S:\dev\vcpkg\vcpkg.exe (tool 2025-07-21).

Тулчейн (фактические пути на GUSIK-PC)

Flutter: S:\dev\flutter · vcpkg: S:\dev\vcpkg (VCPKG_ROOT) · LLVM 15.0.6: S:\dev\LLVM (VS-бандл содержит только clang-format/tidy, БЕЗ libclang.dll — ставили LLVM отдельно, LIBCLANG_PATH=S:\dev\LLVM\bin) · Rust 1.75 (rustup override в клоне) · MSVC 14.44 из vcvars64.

Секреты в CI (gitea Actions)

RUSTDESK_SERVER, RUSTDESK_PUB_KEY, (опц.) RUSTDESK_API_SERVER. Префикс имён — не GITHUB_/GITEA_ (зарезервированы), при необходимости GT_.