## 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)
3.3 KiB
Vendored
Generated
c, SPDX-License-Identifier, Long, Short, Help, Category, Added, Multi, See-also, Example
| c | SPDX-License-Identifier | Long | Short | Help | Category | Added | Multi | See-also | Example | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. | curl | version | V | Show version number and quit | important curl | 4.0 | custom |
|
|
--version
Display information about curl and the libcurl version it uses.
The first line includes the full version of curl, libcurl and other 3rd party libraries linked with the executable.
This line may contain one or more TLS libraries. curl can be built to support more than one TLS library which then makes curl - at start-up - select which particular backend to use for this invocation.
If curl supports more than one TLS library like this, the ones that are not
selected by default are listed within parentheses. Thus, if you do not specify
which backend to use (with the CURL_SSL_BACKEND environment variable) the
one listed without parentheses is used. Such builds also have MultiSSL set as
a feature.
The second line (starts with Release-Date:) shows the release date.
The third line (starts with Protocols:) shows all protocols that libcurl
reports to support.
The fourth line (starts with Features:) shows specific features libcurl
reports to offer. Available features include:
alt-svc
Support for the Alt-Svc: header is provided.
AsynchDNS
This curl uses asynchronous name resolves. Asynchronous name resolves can be done using either the c-ares or the threaded resolver backends.
brotli
Support for automatic brotli compression over HTTP(S).
CharConv
curl was built with support for character set conversions (like EBCDIC)
Debug
This curl uses a libcurl built with Debug. This enables more error-tracking and memory debugging etc. For curl-developers only.
ECH
ECH support is present.
gsasl
The built-in SASL authentication includes extensions to support SCRAM because libcurl was built with libgsasl.
GSS-API
GSS-API is supported.
HSTS
HSTS support is present.
HTTP2
HTTP/2 support has been built-in.
HTTP3
HTTP/3 support has been built-in.
HTTPS-proxy
This curl is built to support HTTPS proxy.
IDN
This curl supports IDN - international domain names.
IPv6
You can use IPv6 with this.
Kerberos
Kerberos V5 authentication is supported.
Largefile
This curl supports transfers of large files, files larger than 2GB.
libz
Automatic decompression (via gzip, deflate) of compressed files over HTTP is supported.
MultiSSL
This curl supports multiple TLS backends.
NTLM
NTLM authentication is supported.
NTLM_WB
NTLM delegation to winbind helper is supported. This feature was removed from curl in 8.8.0.
PSL
PSL is short for Public Suffix List and means that this curl has been built with knowledge about "public suffixes".
SPNEGO
SPNEGO authentication is supported.
SSL
SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S and so on.
SSLS-EXPORT
This build supports TLS session export/import, like with the --ssl-sessions.
SSPI
SSPI is supported.
TLS-SRP
SRP (Secure Remote Password) authentication is supported for TLS.
Unicode
Unicode support on Windows.
UnixSockets
Unix sockets support is provided.
zstd
Automatic decompression (via zstd) of compressed files over HTTP is supported.