Prd/docs/runbooks/windows-wsl2-build.md
Lucy Doupalů be9f14ce34 Helpdesk - operator console + patched GrapheneOS Dialer for call handling
A small helpdesk system: an office Pixel running a patched GrapheneOS Dialer
answers technician calls, records both call legs as separate channels, and a
Ruby backend transcribes them through Whisper and files an AI summary against
the caller.

Squashed to a single commit for sharing. No credentials are included; secrets
live outside the repo in /etc/helpdesk/env on the server or a gitignored
.claude/env.local locally. See .claude/env.local.example for the shape.

Start at README.md, then docs/architecture.md.
2026-07-27 18:50:32 +02:00

4.6 KiB

Runbook - building the stallion Dialer on a Windows 11 PC (WSL2)

The WSL2-specific delta only. Everything about the AOSP build itself (sync, adevtool, lunch, m) is identical to Linux - see graphene-build.md and don't duplicate its judgement here. This file exists because the one-time WSL2 environment is where every Windows AOSP build goes wrong.

Device is stallion (Pixel 10a); pick the current Stable tag per graphene-build.md. The AOSP tree is synced fresh on the Windows machine - never copied from another box.

Why WSL2 needs special care

AOSP will silently produce a broken tree or fail cryptically if any of these are wrong:

  1. The source tree MUST live on the WSL2 native ext4 filesystem (under ~), NOT under /mnt/c or any Windows mount. The Windows filesystem is case-insensitive and slow over the 9P bridge; AOSP needs case-sensitive and will corrupt or fail. This is the number one WSL2 AOSP failure.
  2. Give WSL2 enough RAM. The LTO+CFI link step peaks over 32 GiB and WSL2 defaults to about half of host RAM. Too little means an OOM kill hours into the build.
  3. ~350 GiB free on the Windows drive backing the WSL2 vhdx (source + build output + headroom). The vhdx grows on demand, so the host drive must actually have the space.
  4. git config --global core.autocrlf false inside WSL2 - CRLF rewriting breaks patches and shell scripts.

If the host doesn't have about 64 GiB RAM and 350 GiB free, stop: a cold AOSP build under those constraints is slower and more fragile than using the existing Linux build box.

One-time Windows-side setup

In an elevated PowerShell:

wsl --install -d Ubuntu-24.04
wsl --set-default-version 2
wsl --status

Create C:\Users\<you>\.wslconfig (the RAM cap is the part that matters):

[wsl2]
memory=48GB           # >=32GB required; ~75% of host RAM
processors=16
swap=16GB

Apply with wsl --shutdown, reopen Ubuntu, confirm with free -h and nproc.

Inside WSL2 Ubuntu

sudo apt update
sudo apt install repo yarnpkg zip rsync git python3 gnupg openssh-client curl
sudo dpkg --add-architecture i386 && sudo apt update
sudo apt install libc6:i386 lib32stdc++6 lib32gcc-s1
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - && sudo apt install nodejs

git config --global core.autocrlf false     # WSL2-critical
git config --global user.name  "<you>"
git config --global user.email "<you@…>"

Clone the Helpdesk repo. vmin git is SSH-only, so you need your SSH key added to GitLab first (see docs/onboarding.md):

cd ~ && git clone git@gitlab.vmin.cz:vm/helpdesk.git Helpdesk

Sync AOSP and build

Follow graphene-build.md verbatim, inside the Ubuntu shell and under ~:

mkdir ~/grapheneos-<tag> && cd ~/grapheneos-<tag>
repo init -u https://github.com/GrapheneOS/platform_manifest.git -b refs/tags/<tag>
# verify the manifest tag, then:
repo sync -j"$(nproc)"                        # ~100-200 GB download; re-run to resume

source build/envsetup.sh
yarnpkg --cwd vendor/adevtool/ install
adevtool generate-all -d stallion

Apply both Helpdesk patch sets (paths default to the Linux build box, so override them):

cd ~/Helpdesk
DIALER_TREE=~/grapheneos-<tag>/packages/apps/Dialer   bash components/dialer-patch/apply.sh
SEPOLICY_TREE=~/grapheneos-<tag>/system/sepolicy      bash components/sepolicy-patch/apply.sh
# expect: overlay copied + patches 0001…0009 applied (or "already applied" on a re-run)

Build the same variant the office device runs (userdebug, test keys, unlocked - no signing keys, no relock):

cd ~/grapheneos-<tag>
source build/envsetup.sh
lunch stallion-cur-userdebug
m Dialer                         # quick compile check of the patch first
m target-files-package
m otatools-package

A cold build is hours even on fast hardware; incremental Dialer rebuilds after that are minutes.

Flash from Windows

Procedure and brick-safety rules: pixel10a-flash-manual.md. For a reflash of an already-unlocked phone, use fastboot flashall without -w.

WSL2 has no native USB, so either flash from the Windows side (the build output is reachable at \\wsl$\Ubuntu-24.04\home\<you>\grapheneos-<tag>\out\…, use Google's Windows platform-tools fastboot.exe) or pass the phone into WSL2 with usbipd-win and use the build-matched Linux fastboot. Then run the on-device acceptance from graphene-build.md.

What is not in the repo

Secrets (.claude/env.local, mTLS p12 files, API keys) are gitignored by design, and the device credentials/backend URL are runtime properties, not build artifacts - set them per docs/phone-connectivity.md after flashing.