## Problem Windows builds break with a current local toolchain (Scoop LLVM 22.1.8, CMake 4.4.0, VS 2026), in two independent ways: 1. The build stops at curl's deliberate guard: `#error "no non-blocking method was found/used/set"` in `third-party/curl/lib/nonblock.c`. 2. From the second configure onward, `cmake --build` re-runs CMake in an endless loop (observed 42 consecutive reconfigure cycles in a single build). Likely the same mechanism behind the "endlessly building" VS 2026 note in `docs/setup/dev/vs.md`. ## Root cause 1. `third-party/curl/CMake/CurlTests.c` passes `int *` to `ioctlsocket()`, whose third parameter is `u_long *`. Clang 22 promotes `-Wincompatible-pointer-types` to a hard error in C, so the `HAVE_IOCTLSOCKET_FIONBIO` try_compile silently fails and `curl_config.h` never defines it. Upstream CI does not see this because the windows-2022 runner image ships an older LLVM. GCC 14 promotes the same warning to a hard error, which is very likely the `CurlTests.c.obj` failure reported from MSYS2 in open-goal/jak-project#3551. Upstream curl hit the identical problem with GCC 14 and fixed the probe in curl 8.8.0 (curl/curl#13578). 2. The root CMakeLists copies the build tree's `compile_commands.json` into `<src>/build/` for clangd using `configure_file()`, which registers its input as a configure dependency. CMake rewrites `compile_commands.json` late in every generation, after `CTestTestfile.cmake` and `cmake_install.cmake` (outputs of the same Ninja regen rule), so once the dependency is registered the rule is deterministically dirty and every `ninja` invocation re-runs CMake. A pristine first configure is safe (the file does not exist yet, so the `if(EXISTS ...)` guard skips the copy), which is why the loop looks machine- or IDE-specific. ## Fix 1. Per review, re-vendor `third-party/curl` at the `curl-8_21_0` tag (previously `curl-8_3_0`), which carries the upstream probe fix plus two years of upstream development; `vendor.yaml` updated to match. Adjustments the version jump forced: - curl 8.15 removed the native macOS Secure Transport backend (`CURL_USE_SECTRANSP`), so macOS now builds curl against OpenSSL like Linux. The two macOS workflows install Homebrew `openssl@3` and export `OPENSSL_ROOT_DIR` (keg-only), and the macOS setup docs gained the same two lines. - `CURL_BROTLI` / `CURL_ZSTD` switched to AUTO-detection in curl 8.10; pinned OFF to keep the previous no-compression behavior and avoid silently linking whatever the CI images happen to have. - curl's new top-level `BUILD_EXAMPLES` cache option (default ON) leaked into discord-rpc's identically named option and broke configure at a nonexistent `examples/send-presence` directory; pinned OFF ahead of the third-party subdirectories. The diff is dominated by the mechanical tag-tree swap under `third-party/curl` (linguist-vendored, collapsed in review). The hand-written changes are `CMakeLists.txt`, the two macOS workflows, `docs/setup/system/macos.md`, and `vendor.yaml`. 2. Swap `configure_file()` for `file(COPY ...)`: the same clangd copy with no configure dependency registered. (`file(COPY_FILE ... ONLY_IF_DIFFERENT)` would be cleaner still but requires CMake 3.21, above the declared `cmake_minimum_required(VERSION 3.10)`.) ## Test plan - [x] Fresh `cmake --preset Release-windows-clang` (LLVM 22, no cache seeding) completes and logs `Enabled SSL backends: Schannel`; the FIONBIO probe passes without the previous `#error` - [x] Full Windows Release build from scratch in the branch worktree (all 1422 targets) - [x] goalc-test suite: 1509 passed, 0 failed - [x] Second consecutive configure with `compile_commands.json` present: the regen rule in `build.ninja` has no `compile_commands.json` input; `<src>/build/compile_commands.json` is still refreshed for clangd - [x] Repeated `ninja` invocations after a full build no longer re-run CMake - [x] macOS Intel and ARM CI green (first exercise of the OpenSSL backend switch) --- I work off a self-hosted forge, so this GitHub account is quiet; the configure logs and ninja dirty-node traces from the investigation are available if anyone wants the raw data. (AI-assisted)
5.8 KiB
Vendored
Generated
IPFS
For an overview about IPFS, visit the IPFS project site.
In IPFS there are two protocols. IPFS and IPNS (their workings are explained
in detail here). The ideal way to access
data on the IPFS network is through those protocols. For example to access
the Big Buck Bunny video the ideal way to access it is like:
ipfs://bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
IPFS Gateways
IPFS Gateway acts as a bridge between traditional HTTP clients and IPFS. IPFS Gateway specifications of HTTP semantics can be found here.
Deserialized responses
By default, a gateway acts as a bridge between traditional HTTP clients and IPFS and performs necessary hash verification and deserialization. Through such gateway, users can download files, directories, and other content-addressed data stored with IPFS or IPNS as if they were stored in a traditional web server.
Verifiable responses
By explicitly requesting application/vnd.ipld.raw or application/vnd.ipld.car responses, by means defined in Trustless Gateway Specification, the user is able to fetch raw content-addressed data and perform hash verification themselves.
This enables users to use untrusted, public gateways without worrying they might return invalid/malicious bytes.
IPFS and IPNS protocol handling
There are various ways to access data from the IPFS network. One such way is
through the concept of public
"gateways". The
short version is that entities can offer gateway services. An example here
that is hosted by Protocol Labs (who also makes IPFS) is dweb.link and
ipfs.io. Both sites expose gateway functionality. Getting a file through
ipfs.io looks like this:
https://ipfs.io/ipfs/bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
If you were to be running your own IPFS node then you, by default, also have a local gateway running. In its default configuration the earlier example would then also work in this link:
http://127.0.0.1:8080/ipfs/bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
curl handling of the IPFS protocols
The IPFS integration in curl hides this gateway logic for you. Instead of providing a full URL to a file on IPFS like this:
curl http://127.0.0.1:8080/ipfs/bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
You can provide it with the IPFS protocol instead:
curl ipfs://bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
With the IPFS protocol way of asking a file, curl still needs to know the gateway. curl essentially rewrites the IPFS based URL to a gateway URL.
IPFS_GATEWAY environment variable
If the IPFS_GATEWAY environment variable is found, its value is used as
gateway.
Automatic gateway detection
When you provide no additional details to curl then it:
- First looks for the
IPFS_GATEWAYenvironment variable and use that if it is set. - Looks for the file:
~/.ipfs/gateway. If it can find that file then it means that you have a local gateway running and that file contains the URL to your local gateway.
If curl fails, you are presented with an error message and a link to this page to the option most applicable to solving the issue.
--ipfs-gateway argument
You can also provide a --ipfs-gateway argument to curl. This overrules any
other gateway setting. curl does not fallback to the other options if the
provided gateway did not work.
Gateway redirects
A gateway could redirect to another place. For example, dweb.link redirects
path based
requests to subdomain
based
ones. A request using:
curl ipfs://bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi --ipfs-gateway https://dweb.link
Which would be translated to:
https://dweb.link/ipfs/bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi
redirects to:
https://bafybeigagd5nmnn2iys2f3doro7ydrevyr2mzarwidgadawmamiteydbzi.ipfs.dweb.link
If you trust this behavior from your gateway of choice then passing the -L
option follows the redirect.
Error messages and hints
Depending on the arguments, curl could present the user with an error.
Gateway file and environment variable
curl tried to look for the file: ~/.ipfs/gateway but could not find it. It
also tried to look for the IPFS_GATEWAY environment variable but could not
find that either. This happens when no extra arguments are passed to curl and
letting it try to figure it out automatically.
Any IPFS implementation that has gateway support should expose its URL in
~/.ipfs/gateway. If you are already running a gateway, make sure it exposes
the file where curl expects to find it.
Alternatively you could set the IPFS_GATEWAY environment variable or pass
the --ipfs-gateway flag to the curl command.
Malformed gateway URL
The command executed evaluates in an invalid URL. This could be anywhere in the URL, but a likely point is a wrong gateway URL.
Inspect the URL set via the IPFS_GATEWAY environment variable or passed with
the --ipfs-gateway flag. Alternatively opt to go for the
automatic gateway detection.