# 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 --flutter` → `dist/`. Есть 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`): ```rust 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=,key=.exe` — конфиг читается из имени файла (`EXE_RENDEZVOUS_SERVER`). ## Windows toolchain (поднять один раз на GUSIK-PC) Версии — из `upstream.txt` (пины из `flutter-build.yml@1.4.9`): - **Rust 1.75** — `rustup 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. **Грабля:** codegen зовёт `rustfmt`; без него (`rustup component add rustfmt --toolchain 1.75-...`) он крэшится ПОСЛЕ генерации rust-моста, но ДО dart-стороны — `bridge_generated.rs` есть, а `generated_bridge.dart`/`.freezed.dart` нет → flutter build падает `EventToUI_Event/RustdeskImpl isn't a type`. Поэтому проверять надо dart-файлы, не только rust. ### Открытый вопрос (решить при первой сборке) Апстрим для 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_`.