Files
psxrecomp/third_party
Alexandros Mandravillis 328d879512 build: vendor libjuice so netplay builds configure offline
With PSX_NETPLAY=ON, recomp-net FetchContents libjuice v1.7.2 from GitHub
at configure time. That download is outside third_party/deps.manifest, so
PSX_DEPS_OFFLINE does not cover it, and a build with no network (a sealed
CI job, a player behind a firewall) fails inside the FetchContent subbuild
with a curl error.

Commit the same archive recomp-net pins (MPL-2.0, 108 KB) and declare it
before add_subdirectory(recomp-net). FetchContent keeps the first
declaration of a name, so recomp-net's own FetchContent_MakeAvailable
builds the vendored copy with its own options. The configure stops if
recomp-net ever pins a different libjuice than the manifest.

Ship the MPL-2.0 notice and source location in runtime/licenses/ and
THIRD_PARTY_ATTRIBUTION.md. Two ctest cases configure a stand-in
recomp-net with the network sealed: the matching pin must configure,
a different pin must stop with the mismatch message.
2026-09-30 15:57:32 +03:00
..

third_party/ — vendored dependency archives

Source archives the build would otherwise download, staged here so a checkout can configure with no network at all.

deps.manifest is the single pin record — name, archive file, SHA256, upstream URL. Both cmake/psx_dependency_archive.cmake and tools/ci/vendor_deps.sh read it, so a vendored archive can never drift from the pin the build would have fetched. A vendored archive is verified against the same URL_HASH as a downloaded one; nothing here is trusted because it is local.

What is committed, and why only that

Only libchdr (libchdr-<sha>.tar.gz, ~520 KB, BSD-3-Clause) and libjuice (libjuice-v1.7.2.tar.gz, ~110 KB, MPL-2.0) — see ../THIRD_PARTY_ATTRIBUTION.md.

runtime/runtime.cmake includes chd_dependency.cmake unconditionally, and libchdr has no find_package path and ships in no toolchain pack — so it is both the first network access a build makes and the only one with no local fallback. A player building a released game behind a firewall used to fail there, inside a FetchContent subbuild, before reaching any other dependency.

libjuice is what recomp-net's ICE transport downloads at configure time when PSX_NETPLAY=ON. It has no local fallback either, so a sealed netplay build failed the same way. runtime/netplay_dependency.cmake declares the vendored copy before recomp-net asks for it, and stops the configure if recomp-net's pin and this manifest row ever differ.

SDL3 (~15 MB) and zlib resolve from a system package or a toolchain pack first and are not committed; .gitignore keeps them out. Stage them on demand:

tools/ci/vendor_deps.sh              # every dependency in the manifest
tools/ci/vendor_deps.sh SDL3         # just one
tools/ci/vendor_deps.sh --check      # verify what is staged; never downloads

Then configure with -DPSX_DEPS_OFFLINE=ON to turn any remaining download attempt into a hard error that names the missing archive, instead of a fetch that stalls behind a proxy and fails three CMake frames deep.

Adding a dependency

Add the row to deps.manifest, run tools/ci/vendor_deps.sh <name> to stage and verify the archive, and resolve it in CMake through psxrecomp_dependency_archive() / psxrecomp_dependency_source_dir() rather than a literal URL — a literal URL is a build that cannot go offline. Commit the archive only if the dependency has no local fallback and is small.