build: replace wasm patch with third_party/qemu submodule
The 7.7k-line qemu-wasm patch was really a fork, so vendor it as a submodule (pinned at the xteink QEMU fork) and build it directly. Removes the clone/commit-check/patch/reset machinery, the redundant web-dev/patch targets, and 0002-qemu-wasm.patch. Editing third_party/qemu now recompiles incrementally via plain `make web`. Native build keeps 0001-xteink-machine.patch.
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
[submodule "third_party/qemu"]
|
||||
path = third_party/qemu
|
||||
url = git@ssh.gitea.va.reichard.io:evan/qemu-xteink.git
|
||||
branch = main
|
||||
@@ -5,15 +5,13 @@ FIRMWARE_DIR ?= $(FIRMWARE_REPO)/.pio/build/default
|
||||
SD_SRC ?= $(FIRMWARE_REPO)/sdcard
|
||||
QEMU_SRC ?= _scratch/qemu-src
|
||||
QEMU_BIN = $(QEMU_SRC)/build/qemu-system-riscv32
|
||||
QEMU_WASM_SRC ?= _scratch/qemu-wasm-src
|
||||
# Working tree for the fast dev loop: edit here, `make web-dev` compiles it incrementally.
|
||||
DEV_SRC ?= _scratch/qemu-fix-src
|
||||
# Commit the 0002 patch is diffed against when running `make patch`.
|
||||
PATCH_BASE ?= 610f8c69bc91dcb4ba81de1b7d2e74cc2adfb31e
|
||||
# QEMU source for the wasm build is the third_party/qemu submodule. Edit it in
|
||||
# place; `make web` recompiles only what changed, no patch round-trip.
|
||||
QEMU_WASM_SRC ?= third_party/qemu
|
||||
WASM_OUT ?= dist/wasm
|
||||
VARIANT ?= x3
|
||||
|
||||
.PHONY: firmware sdimage qemu qemu-wasm qemu-wasm-dev web web-dev web-test patch run run-upstream chip clean
|
||||
.PHONY: firmware sdimage qemu qemu-wasm web web-test run run-upstream chip clean
|
||||
|
||||
firmware:
|
||||
esptool --chip esp32c3 merge-bin -o flash.bin \
|
||||
@@ -33,23 +31,11 @@ qemu:
|
||||
qemu-wasm:
|
||||
QEMU_WASM_SRC=$(QEMU_WASM_SRC) WASM_OUT=$(WASM_OUT) scripts/build-qemu-wasm.sh
|
||||
|
||||
# Incremental build straight from $(DEV_SRC); no patch reset, so edits compile fast.
|
||||
qemu-wasm-dev:
|
||||
QEMU_WASM_DEV=1 QEMU_WASM_SRC=$(DEV_SRC) WASM_OUT=$(WASM_OUT) scripts/build-qemu-wasm.sh
|
||||
|
||||
# Regenerate the wasm patch from $(DEV_SRC) once the dev tree is where you want it.
|
||||
patch:
|
||||
cd $(DEV_SRC) && git diff --binary $(PATCH_BASE) > $(CURDIR)/qemu/patches/0002-qemu-wasm.patch
|
||||
|
||||
# Serve over HTTPS by default so headless/LAN access is cross-origin isolated. Override with WEB_TLS=.
|
||||
WEB_TLS ?= --tls
|
||||
web: qemu-wasm
|
||||
python3 scripts/serve-web.py $(WEB_TLS)
|
||||
|
||||
# Fast iteration: incremental compile from $(DEV_SRC), then serve. Run `make patch` before committing.
|
||||
web-dev: qemu-wasm-dev
|
||||
python3 scripts/serve-web.py $(WEB_TLS)
|
||||
|
||||
web-test:
|
||||
node scripts/test-web.mjs
|
||||
|
||||
|
||||
@@ -29,9 +29,15 @@ Point at a firmware build with `make firmware FIRMWARE_DIR=/path/to/.pio/build/g
|
||||
|
||||
## WebAssembly build
|
||||
|
||||
Podman or Docker is required. The build is limited to `riscv32-softmmu` and the
|
||||
X3/X4 device graph; networking, audio, virtfs, tools, docs, and unrelated boards
|
||||
are disabled.
|
||||
Podman or Docker is required. The QEMU source is the `third_party/qemu`
|
||||
submodule, so initialize it first:
|
||||
|
||||
```sh
|
||||
git submodule update --init third_party/qemu
|
||||
```
|
||||
|
||||
The build is limited to `riscv32-softmmu` and the X3/X4 device graph;
|
||||
networking, audio, virtfs, tools, docs, and unrelated boards are disabled.
|
||||
|
||||
```sh
|
||||
make qemu-wasm
|
||||
@@ -67,9 +73,11 @@ browser JS heap where supported. X4 remains a white display stub.
|
||||
and its device models (I²C fingerprints, ADC, GPIO, SPI2, X3 UC8253, X4 panel
|
||||
stub, SD-over-SPI fix), applied onto the pinned espressif/qemu commit by
|
||||
`scripts/build-qemu.sh`.
|
||||
- `qemu/patches/0002-qemu-wasm.patch` and `qemu/wasm/Dockerfile` — the pinned
|
||||
qemu-wasm host backend port and minimal Emscripten dependency environment,
|
||||
built by `scripts/build-qemu-wasm.sh`.
|
||||
- `third_party/qemu` — submodule of the [xteink QEMU fork](git@ssh.gitea.va.reichard.io:evan/qemu-xteink.git)
|
||||
(espressif/qemu + the machine models + the wasm32 TCG backend), built for the
|
||||
browser by `scripts/build-qemu-wasm.sh`. Edit it in place; `make web`
|
||||
recompiles incrementally. `qemu/wasm/Dockerfile` is the pinned Emscripten
|
||||
dependency environment.
|
||||
- `flake.nix` — the espressif-qemu *release* binary as the fast generic baseline
|
||||
(`nix run .#run-upstream -- flash.bin`), plus a devShell with QEMU's full build
|
||||
environment. `Makefile` — `qemu`, `firmware`, `sdimage`, `run`, `chip`.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,13 +2,12 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
SRC="${QEMU_WASM_SRC:-$ROOT/_scratch/qemu-wasm-src}"
|
||||
# QEMU source is the third_party/qemu submodule (fork with the xteink machine +
|
||||
# wasm32 backend). Edit it in place; builds compile incrementally, no patching.
|
||||
SRC="${QEMU_WASM_SRC:-$ROOT/third_party/qemu}"
|
||||
OUT="${WASM_OUT:-$ROOT/dist/wasm}"
|
||||
[[ "$SRC" = /* ]] || SRC="$ROOT/$SRC"
|
||||
[[ "$OUT" = /* ]] || OUT="$ROOT/$OUT"
|
||||
TAG="esp-develop-9.2.2-20260417"
|
||||
COMMIT="40edccac415693c5130f91c01d84176ae6008566"
|
||||
QEMU_WASM_COMMIT="0ef7b4e2814b231705d8371dd7997f5b72e70baf"
|
||||
IMAGE="xteink-qemu-wasm-build"
|
||||
JOBS="${JOBS:-$(nproc 2>/dev/null || echo 2)}"
|
||||
|
||||
@@ -20,35 +19,13 @@ else
|
||||
ENGINE=docker
|
||||
fi
|
||||
|
||||
# Dev Mode - Build directly out of an already-patched working tree (e.g. _scratch/qemu-fix-src);
|
||||
# skip clone/commit-check/patch so edits compile incrementally without the patch round-trip.
|
||||
if [ -n "${QEMU_WASM_DEV:-}" ]; then
|
||||
cd "$SRC"
|
||||
else
|
||||
if [ ! -d "$SRC/.git" ]; then
|
||||
git clone --depth 1 --branch "$TAG" https://github.com/espressif/qemu "$SRC"
|
||||
fi
|
||||
|
||||
cd "$SRC"
|
||||
if [ "$(git rev-parse HEAD)" != "$COMMIT" ]; then
|
||||
echo "QEMU source must be $COMMIT ($TAG)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Re-apply Patches On Drift - The source tree is a build artifact of the patches; reset and re-apply whenever a patch is newer than the last apply so `make web` never silently rebuilds stale sources.
|
||||
STAMP=".xteink-patch-stamp"
|
||||
if [ ! -f hw/display/xteink_x3_eink.c ] || [ ! -f tcg/wasm32.c ] \
|
||||
|| [ "$ROOT/qemu/patches/0001-xteink-machine.patch" -nt "$STAMP" ] \
|
||||
|| [ "$ROOT/qemu/patches/0002-qemu-wasm.patch" -nt "$STAMP" ]; then
|
||||
git reset --hard "$COMMIT"
|
||||
git clean -fdx -e build
|
||||
git apply "$ROOT/qemu/patches/0001-xteink-machine.patch"
|
||||
git apply --whitespace=nowarn "$ROOT/qemu/patches/0002-qemu-wasm.patch"
|
||||
touch "$STAMP"
|
||||
fi
|
||||
if [ ! -f "$SRC/tcg/wasm32.c" ]; then
|
||||
echo "third_party/qemu submodule not checked out; run: git submodule update --init" >&2
|
||||
exit 1
|
||||
fi
|
||||
cd "$SRC"
|
||||
|
||||
printf 'Building Emscripten environment (qemu-wasm %s)\n' "$QEMU_WASM_COMMIT"
|
||||
printf 'Building Emscripten environment for %s\n' "$SRC"
|
||||
"$ENGINE" build -t "$IMAGE" -f "$ROOT/qemu/wasm/Dockerfile" "$ROOT/qemu/wasm"
|
||||
|
||||
FLAGS="-O3 -Wno-error=unused-command-line-argument -matomics -mbulk-memory -DNDEBUG -DG_DISABLE_ASSERT -D_GNU_SOURCE -sASYNCIFY=1 -pthread -sPROXY_TO_PTHREAD=1 -sFORCE_FILESYSTEM -sALLOW_TABLE_GROWTH -sINITIAL_MEMORY=64MB -sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=1GB -sSTACK_SIZE=1048576 -sWASM_BIGINT -sMALLOC=mimalloc -sEXPORT_ES6=1 -sASYNCIFY_IMPORTS=ffi_call_js"
|
||||
|
||||
+1
Submodule third_party/qemu added at 13b9231f6e
Reference in New Issue
Block a user