Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
6cc3518
docs(phase3): bootstrap status — steamrt4 SDK verified pullable, prot…
weter11 Aug 11, 2026
53c9059
docs(phase3): module test build PASSED; classic-wow64 finding; pure-P…
weter11 Aug 11, 2026
ade7302
docs(phase3): pure-PE build VERIFIED — Makefile.in patch + module gat…
weter11 Aug 11, 2026
579293e
feat(valve-stack): Phase 2 complete — native Rust Proton ABI, env-par…
weter11 Aug 11, 2026
b4a0be9
fix(build): resolve multi-arch vkd3d linkage and wineopenxr i386 cros…
weter11 Aug 11, 2026
2c0bd94
fix(runner): use symlink_metadata to prevent EEXIST on dangling DLL s…
weter11 Aug 12, 2026
8a56ed2
fix(runner): spawn PerGame background Steam with the game's runner
weter11 Aug 12, 2026
c5c84b1
docs(phase3): mark Phase 3 CLOSED — pure-PE WoW64 Proton 11.0 built, …
weter11 Aug 12, 2026
4154ec9
fix(runner): auto-fallback Shared->PerGame prefix mode on runner mism…
weter11 Aug 12, 2026
f0bdf79
fix(runner): self-heal dangling builtin DLL symlinks in prefixes
weter11 Aug 12, 2026
c376560
docs(phase3): record prefix self-heal follow-up (dangling builtin DLL…
weter11 Aug 12, 2026
b5f5c0a
fix(runner): background Steam always runs in master prefix under runt…
weter11 Aug 13, 2026
fcc0c54
docs(phase3): record background-Steam master-prefix fix (exit-1 regre…
weter11 Aug 13, 2026
284e697
fix(runner): revert background-Steam master-prefix split; catch post-…
weter11 Aug 13, 2026
1543484
feat(steam): sync master Steam session state into per-game prefixes
weter11 Aug 14, 2026
5eb0aa5
docs(phase3): record session-auth sync + Portal 2 blocker root cause …
weter11 Aug 14, 2026
bffe375
docs(phase3): MachineGuid injection verdict + routing gap + open prod…
weter11 Aug 15, 2026
f19d61c
docs(phase3): protocol-931 pin falsification + phase3 closure record …
weter11 Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

95 changes: 95 additions & 0 deletions docs/architecture/patches/proton-11.0-makefile-pure-pe.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
--- /tmp/Makefile.in.pristine 2026-08-11 15:45:39.307229465 -0200
+++ /home/wer/devis/steamflow-phase3/proton/Makefile.in 2026-08-11 17:00:13.949542527 -0200
@@ -75,7 +75,11 @@
TARGET_ARCH ?= x86_64

ifeq ($(TARGET_ARCH),x86_64)
- ARCHS += i386-unix x86_64-unix
+ # Pure-PE WoW64 (Phase 3 directive): NO i386-unix side. The 32-bit half
+ # ships as PE32 DLLs cross-compiled by the single 64-bit tree via
+ # --enable-archs=i386-windows,x86_64-windows (see WINE_x86_64_AUTOCONF_ARGS).
+ # Zero 32-bit ELF binaries are produced; no i686-linux-gnu host build.
+ ARCHS += x86_64-unix
else ifeq ($(TARGET_ARCH),arm64)
ARCHS += aarch64-unix aarch64-windows arm64ec-windows
else
@@ -445,6 +449,12 @@
WINEOPENXR_DEPENDS = wine openxr

WINEOPENXR_aarch64_PE_ARCHS = arm64ec x86_64
+# Pure-PE (Phase 3): the single x86_64 wine tree configures
+# --enable-archs=x86_64,i386, which would make wineopenxr's makedep build try
+# to cross-compile an i386-windows half — its openxr_loader.c is not
+# 32-bit-clean (casts pointer to UINT64; fails -Werror=pointer-to-int-cast)
+# and Valve never builds 32-bit wineopenxr. Restrict to x86_64 PE only.
+WINEOPENXR_x86_64_PE_ARCHS = x86_64

$(eval $(call rules-source,wineopenxr,$(SRCDIR)/wineopenxr))
$(eval $(call rules-makedep,wineopenxr,x86_64))
@@ -565,9 +575,13 @@
# the same source directory.
#
# The below assures that only a single configure/build step can run at a time.
+# (The i386↔x86_64 coupling only applies when the i386-unix side exists —
+# pure-PE builds have no i386-unix, so those edges are omitted.)
+ifneq ($(findstring i386-unix,$(ARCHS)),)
$(OBJ)/.kaldi-x86_64-configure: $(OBJ)/.kaldi-i386-configure
$(OBJ)/.kaldi-i386-build: $(OBJ)/.kaldi-x86_64-configure
$(OBJ)/.kaldi-i386-build: $(OBJ)/.kaldi-x86_64-build
+endif

##
## vosk
@@ -629,6 +643,29 @@
VKD3D_PE_CFLAGS="-I$(VULKAN_HEADERS_x86_64_DST)/include -I$(VKD3D_x86_64_DST)/include/vkd3d" \
VKD3D_PE_LIBS="-L$(VKD3D_x86_64_LIBDIR)/vkd3d/x86_64-windows -l:libvkd3d-1.dll -l:libvkd3d-shader-1.dll -l:libvkd3d-utils-1.dll"

+# Pure-PE single-tree build (Phase 3): the one x86_64 wine tree cross-compiles
+# BOTH i386-windows and x86_64-windows DLLs, but a single -L dir in
+# VKD3D_PE_LIBS can only serve one arch: makedep passes -L args verbatim to
+# every arch link (add_import_libs, case 'L'), so a -L in VKD3D_PE_LIBS would
+# precede any per-arch -L and the i386-windows wined3d.dll link would pick the
+# x86_64-windows libvkd3d-1.dll (PE32+ in a PE32 link) → "file not recognized:
+# file format not recognized". Wine's generated Makefile appends
+# $(i386_LDFLAGS)/$(x86_64_LDFLAGS) per link (makedep.c arch_make_variable
+# "LDFLAGS"), so route the -L dirs through those instead and keep only the
+# -l: names in VKD3D_PE_LIBS (later assignment on the configure command line
+# wins). The per-arch LDFLAGS are appended to the make variables — the
+# rules-common ENV compose (rules-common.mk "x86_64_LDFLAGS=... $(x86_64_LDFLAGS)
+# $(LDFLAGS)") picks them up while keeping the media LIBFLAGS.
+ifneq ($(findstring i386-unix,$(ARCHS)),)
+# classic-wow64: each wine tree builds a single arch; VKD3D_PE_LIBS above is
+# already per-tree (WINE_i386_*/WINE_x86_64_*), nothing extra needed.
+else
+WINE_x86_64_AUTOCONF_ARGS += \
+ VKD3D_PE_LIBS="-l:libvkd3d-1.dll -l:libvkd3d-shader-1.dll -l:libvkd3d-utils-1.dll"
+x86_64_LDFLAGS += -L$(VKD3D_x86_64_LIBDIR)/vkd3d/x86_64-windows
+i386_LDFLAGS += -L$(VKD3D_i386_LIBDIR)/vkd3d/i386-windows
+endif
+
WINE_DEPENDS = gst_orc gstreamer gst_base ffmpeg openfst kaldi vosk
WINE_i386_DEPENDS = vkd3d
WINE_x86_64_DEPENDS = piper vkd3d
@@ -1445,14 +1482,17 @@

.PHONY: module32 module64 module

-module32: | all-source wine-i386-configure
- +$(MAKE) -j$(J) $(filter -j%,$(MAKEFLAGS)) $(MFLAGS) $(MAKEOVERRIDES) -C $(WINE_i386_OBJ)/dlls/$(module)
-
-module64: | all-source wine-x86_64-configure
+module32: | all-source wine-x86_64-configure
+$(MAKE) -j$(J) $(filter -j%,$(MAKEFLAGS)) $(MFLAGS) $(MAKEOVERRIDES) -C $(WINE_x86_64_OBJ)/dlls/$(module)

+# Pure-PE: the single x86_64 tree cross-compiles BOTH PE halves
+# (--enable-archs=x86_64,i386), so module64 is just an alias of module32.
+# Running both recipes concurrently would race on shared archives
+# (e.g. dlls/ntdll/i386-windows/libntdll.a "file truncated").
+module64: module32
+
module: | all-source wine-configure
-module: module32 module64
+module: module64

###############################
else # outside of the container
Loading