Skip to content

Fix clean-build release pipeline + null-return interface getters - #5

Merged
gabrielgad merged 13 commits into
devfrom
fix/missing-interface-null-return
Jun 17, 2026
Merged

gabrielgad merged 13 commits into
devfrom
fix/missing-interface-null-return

Conversation

@gabrielgad

Copy link
Copy Markdown
Collaborator

Summary

Restores a working clean Windows release build (it had been impossible for months — warm per-runner deps caches masked the breakage, so the nightly only ever shipped Steam.dll), and makes the interface getters non-fatal so the "Missing interface" class of games (e.g. Voidigo) no longer hard-exits.

Verified end-to-end: a from-scratch deps rebuild + build on the self-hosted runners now produces all four steam_api(64).dll (regular + experimental, x64 + x32) plus Steam.dll, gated by a real verify step.

Emulator behaviour

  • Interface getters return null instead of exiting. All 35 getters in steam_client_interface_getter.cpp now log + return nullptr (matching real steamclient on unknown versions) instead of report_missing_impl_and_exit. Dropped the blocking "Missing interface" MessageBox (it could fatally stall under Proton); report_missing_impl is now a pure file logger.

Clean-build pipeline (all latent, surfaced once a true clean build ran)

  • CI loop bug: echo ... (%%A, release) closed the do( block early -> only lib_steam_old ever built. Parens -> brackets.
  • deps: drop curl CURL_CA_FALLBACK (OpenSSL-only; hard-errors with MbedTLS); mirror zlib zs.lib -> zlibstatic.lib (protobuf/curl link); BUILD_TESTING=OFF + best-effort long paths (abseil test-helper MAX_PATH / MSB3491); force_rebuild input + stronger cache-completeness check.
  • lib_steam_old: define dbg_logger unconditionally (the GSE_FORCE_LOG refactor left it #ifndef EMU_RELEASE_BUILD).
  • abseil link list: reconcile premake5.lua with current abseil (drop absl_bad_any_cast_impl/bad_optional_access/bad_variant_access/log_entry; pool_urbg -> entropy_pool).
  • clean:true checkout: stop linking/shipping stale artifacts (a removed base_gcmessages.pb.obj was dragging in full-protobuf symbols; old DLLs were being shipped).
  • ImGui 1.92 / InGameOverlay port: GlyphExtraSpacing -> GlyphExtraAdvanceX; remove RendererResource_t::SetAutoLoad; remove ImFontAtlas::Build(); link ntdll for NtQueryInformation*. (Upstream Detanup01/gbe_fork has the identical skew.)
  • build hygiene: drop the crashing --dosstub/--winsign post-build; harden the release gate (real if defined check, correct x32 paths, wipe stale output).

Notes

  • The deps cache check now self-heals partial caches; force_rebuild is available for a full refresh.
  • splitux uses the experimental variant; the experimental DLLs build and ship.

…poll

The old ISteamNetworkingSockets001-011 interfaces polled connection state via
SteamNetConnectionInfo001_t through an unimplemented stub returning false, so
UE5's SteamSockets driver never saw the connection reach Connected and never sent
data (120s timeout). Implement set_steamnetconnectioninfo_001 (from sns_fix
2589077); keeps a SPLITUX-DEBUG wire trace.
Release builds previously compiled out ALL logging: PRINT_DEBUG expanded to
nothing (EMU_RELEASE_BUILD), the global dbg_logger and every dbg_log method
body were stripped. That makes a shipped emulator impossible to observe
(e.g. LAN lobby matchmaking) without a separate debug build.

Compile logging into release too, gated at runtime by the GSE_FORCE_LOG env
var (dbg_log::is_active): debug builds always log; release logs only when the
var is set. PRINT_DEBUG now wraps its body in 'if (dbg_logger.is_active())' so
an inactive logger costs one cached bool check and runs NO side effects — in
particular it must not call PRINT_DEBUG_CLEANUP/WSASetLastError, which would
clobber the game's last socket error on every call. open() is the single
runtime gate; all write paths check out_file, so inactive logging no-ops.

Lets us turn on full goldberg logs (STEAM_LOG_<rand>.log next to the exe) on a
release DLL by exporting GSE_FORCE_LOG=1, with zero impact when unset.
…version

The interface getters in steam_client_interface_getter.cpp called
report_missing_impl_and_exit for any version they did not hardcode, which
std::exit()'d the whole game. Real steamclient returns null for unknown
versions, so emulate that: all 35 getters now log via report_missing_impl
and return nullptr. Also drop the blocking 'Missing interface' MessageBox
from report_missing_impl (it could fatally stall games under Proton/Wine);
it is now a pure non-blocking file logger. Legacy report_missing_impl_and_exit
kept but unused.

Also fix emu-build-all-win.yml: the ')' inside the 'echo ... (%%A, release)'
closed the FOR do( block early, so every per-arch target silently failed and
only lib_steam_old shipped. Parens -> brackets.
Three pre-existing breakages stopped the Windows release from producing any
steam_api dll (only the no-longer-relevant Steam.dll shipped):

1. Stale deps cache. emu-deps-win.yml skipped rebuild whenever protobuf existed,
   so a partial cache (protobuf present, zlibstatic.lib missing, stale ImGui /
   InGameOverlay) was treated as complete forever -> api_regular failed LNK1181
   'cannot open input file zlibstatic.lib' and api_experimental failed compiling
   steam_overlay.cpp against old ImGui/InGameOverlay headers. Fix: add a
   force_rebuild input that wipes the cache, and strengthen the 'already built'
   check to also require zlib\install64\lib\zlibstatic.lib so a partial cache
   refreshes itself.

2. lib_steam_old link error. The GSE_FORCE_LOG refactor (514eb90) made
   PRINT_DEBUG reference the global dbg_logger in release builds too, and
   un-gated its definition in base.cpp -- but steam_old_lib/dllmain.cpp still
   defined dbg_logger only under !EMU_RELEASE_BUILD, so release linked with an
   unresolved external. Define it unconditionally, matching base.cpp.

3. Build step aborted before packaging. A trailing warn-only target failure
   (dev-only tool signing, lib_steam_old) leaked a non-zero exit and skipped
   packaging/release. End the build step with exit /b 0 and add a 'Verify
   shippable DLLs built' gate that fails the job only when the four
   regular/experimental steam_api(64).dll outputs are missing.
…ures

A from-scratch deps rebuild failed at curl CMake configure: 'CURL_CA_FALLBACK
only works with OpenSSL' (CMakeLists.txt:1409). We build curl with MbedTLS
(CURL_USE_OPENSSL=OFF), and newer curl hard-errors when CURL_CA_FALLBACK is set
without OpenSSL. The flag is an OpenSSL-only CA-cert fallback feature and is
meaningless with MbedTLS, so drop it. Latent since the Jan deps bump; masked
because the persistent per-runner caches predate it and clean rebuilds were
never exercised.
…lean build

The current zlib installs its static library as zs.lib, but wild_zlib points
protobuf and curl at ZLIB_LIBRARY=.../zlibstatic.lib, so a from-scratch deps
build failed: protobuf protoc LNK1181 'cannot open input file zlibstatic.lib'.
Warm runners hid it because an older build had left a real zlibstatic.lib in the
(uncleaned) install dir. Copy zs.lib -> zlibstatic.lib right after each zlib
build so the hardcoded path resolves regardless of runner state.
A clean protobuf build failed with MSB3491: abseil's fetched test helper
random_internal_distribution_test_util produces a build/.tlog path that exceeds
Windows' 260-char MAX_PATH. Pass BUILD_TESTING=OFF so protobuf's bundled abseil
skips test targets entirely (we don't need them), and add a best-effort
LongPathsEnabled registry step (ignored if the runner lacks admin) as general
protection for other deep dep paths.
…e gate

api_regular/api_experimental failed to link on a clean build: LNK1181 cannot
open 'absl_bad_any_cast_impl.lib'. premake5.lua's hardcoded abseil lib list was
stale vs the abseil protobuf now builds. Drop libs newer abseil no longer
produces (absl_bad_any_cast_impl, absl_bad_optional_access, absl_bad_variant_access
-> std::; absl_log_entry) and rename absl_random_internal_pool_urbg ->
absl_random_internal_entropy_pool.

Also harden the release path: wipe build/win/vs2022/release before building (the
job checks out clean:false, so stale DLLs from a prior build were lingering and
being shipped), and fix the verify gate (set "MISSING=1" + 'if defined' instead
of a trailing-space-prone string compare that false-passed).
api_experimental failed to compile against the pinned ingame_overlay's bundled
ImGui 1.92 + newer InGameOverlay (upstream gbe_fork has the same skew; it only
built on warm caches). Port the two affected call sites:
- ImGui 1.92 removed ImFontConfig::GlyphExtraSpacing (ImVec2) -> use
  GlyphExtraAdvanceX (float, X only); drop the unsupported Y spacing.
- InGameOverlay dropped RendererResource_t::SetAutoLoad(); autoload is hook-wide
  now and GetResourceId() triggers load. Remove the per-resource call.

Also set the build job checkout to clean:true: api_regular/api_experimental were
linking a stale base_gcmessages.pb.obj (a proto long removed from the repo but
left in the clean:false workspace), which dragged in unresolved full-protobuf
symbols. net.proto is LITE_RUNTIME and links protobuf-lite fine once the ghost
object is gone.
…lay port

Remaining clean-build failures after the deps/abseil/protobuf fixes:
- api_regular x32 linked steam_api.dll fine, then the --dosstub post-build
  (file_dos_stub_x32.exe) crashed (exit -1) and removed it, cascading into a
  SignTool 'file not found'. Drop --dosstub and --winsign from the premake call:
  the emu DLLs don't need a replaced DOS stub or signature. (Keep --winrsrc.)
- api_experimental link: ImGui 1.92 removed ImFontAtlas::Build() (atlas builds
  lazily now) -> drop the call; and the newer InGameOverlay (mini_detour/system)
  needs NtQueryInformationThread/Process -> link ntdll.
- Verify gate checked the wrong 32-bit dir (x86); the build outputs to x32
  (package_win.bat renames to x86 later) -> gate x32.
Reconcile with dev's collective fixes (friend-join, P2P bridge, GSE log, partial
ImGui 1.92 overlay port, abseil list, ntdll). Resolution:
- overlay/networking/base/common_includes/premake5.lua: take dev's (more complete;
  dev already has the abseil reconcile, ntdll, and the full overlay port).
- premake5-deps.lua: dev's base + re-add the zlib zs.lib -> zlibstatic.lib mirror
  (dev lacks it; without it protobuf/curl fail to link on a clean build).
- Kept my unique fixes that dev lacks: interface getters return null, steam_old_lib
  dbg_logger defined unconditionally, and the CI hardening (force_rebuild, stronger
  cache check, clean:true checkout, verify-DLLs gate, dropped flaky dosstub/winsign,
  echo-loop fix).
dev's collective fixes added SDL3 as a linked dependency, but the warm deps cache
(built before SDL was added) lacks SDL3-static.lib, so api_regular/experimental
fail LNK1181. Add it to the cache-completeness check so a stale cache rebuilds.
After merging dev's premake, 32-bit DLLs emit to release/{regular,experimental}/x86
(not x32). The verify gate still checked x32 and false-failed even though all four
DLLs built. Point it at x86.
@gabrielgad
gabrielgad merged commit b3d81cd into dev Jun 17, 2026
45 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant