mirror of
https://github.com/open-goal/jak-project
synced 2026-08-19 22:12:24 -04:00
fix: Windows toolchain compatibility (curl 8.21 re-vendor, endless reconfigure loop) (#4355)
## 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)
This commit is contained in:
committed by
GitHub
parent
888b300487
commit
5d5e35fb9b
+142
@@ -0,0 +1,142 @@
|
||||
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# SPDX-License-Identifier: curl
|
||||
|
||||
name: 'CodeQL'
|
||||
|
||||
'on':
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- '*/ci'
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
- '.circleci/**'
|
||||
- 'appveyor.*'
|
||||
- 'projects/**'
|
||||
- 'tests/data/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
- '.circleci/**'
|
||||
- 'appveyor.*'
|
||||
- 'projects/**'
|
||||
- 'tests/data/**'
|
||||
schedule:
|
||||
- cron: '0 0 * * 4'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
DO_NOT_TRACK: '1'
|
||||
|
||||
jobs:
|
||||
gha_python:
|
||||
if: ${{ github.repository_owner == 'curl' || github.event_name != 'schedule' }}
|
||||
name: 'GHA and Python'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
security-events: write # To create/update security events
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: 'initialize'
|
||||
uses: github/codeql-action/init@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0
|
||||
with:
|
||||
languages: actions, python
|
||||
queries: security-extended
|
||||
|
||||
- name: 'perform analysis'
|
||||
uses: github/codeql-action/analyze@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0
|
||||
|
||||
c:
|
||||
if: ${{ github.repository_owner == 'curl' || github.event_name != 'schedule' }}
|
||||
name: 'C'
|
||||
runs-on: ${{ matrix.platform == 'Linux' && 'ubuntu-latest' || 'windows-2022' }}
|
||||
permissions:
|
||||
security-events: write # To create/update security events
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [Linux, Windows]
|
||||
env:
|
||||
MATRIX_PLATFORM: '${{ matrix.platform }}'
|
||||
steps:
|
||||
- name: 'install prereqs'
|
||||
if: ${{ matrix.platform == 'Linux' }}
|
||||
timeout-minutes: 2
|
||||
run: |
|
||||
sudo find /etc/apt/sources.list.d -type f -not -name 'ubuntu.sources' -delete -print
|
||||
sudo sed -i 's/priority:1/priority:9/' /etc/apt/apt-mirrors.txt; cat /etc/apt/apt-mirrors.txt
|
||||
sudo apt-get -o Dpkg::Use-Pty=0 update
|
||||
sudo apt-get -o Dpkg::Use-Pty=0 install \
|
||||
libpsl-dev libbrotli-dev libidn2-dev libssh2-1-dev libssh-dev \
|
||||
libnghttp2-dev libldap-dev libkrb5-dev libgnutls28-dev libwolfssl-dev
|
||||
/home/linuxbrew/.linuxbrew/bin/brew install c-ares gsasl libnghttp3 libngtcp2 mbedtls rustls-ffi
|
||||
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: 'delete test input C files'
|
||||
shell: bash
|
||||
run: find tests/data -name '*.c' -delete
|
||||
|
||||
- name: 'initialize'
|
||||
# https://github.com/github/codeql-action/blob/main/init/action.yml
|
||||
uses: github/codeql-action/init@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0
|
||||
with:
|
||||
languages: cpp
|
||||
build-mode: manual
|
||||
trap-caching: false
|
||||
|
||||
- name: 'build'
|
||||
timeout-minutes: 10
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "${MATRIX_PLATFORM}" = 'Windows' ]; then
|
||||
cmake -B . -DBUILD_SHARED_LIBS=OFF -DCURL_DROP_UNUSED=ON -DCURL_WERROR=ON \
|
||||
-DCMAKE_VS_GLOBALS=TrackFileAccess=false \
|
||||
-DCURL_USE_SCHANNEL=ON -DCURL_USE_LIBPSL=OFF -DUSE_WIN32_IDN=ON
|
||||
cmake --build . --verbose
|
||||
src/Debug/curl.exe --disable --version
|
||||
else
|
||||
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
||||
|
||||
export PKG_CONFIG_PATH
|
||||
|
||||
# MultiSSL
|
||||
PKG_CONFIG_PATH="$(brew --prefix c-ares)/lib/pkgconfig:$(brew --prefix mbedtls)/lib/pkgconfig:$(brew --prefix rustls-ffi)/lib/pkgconfig:$(brew --prefix gsasl)/lib/pkgconfig"
|
||||
cmake -B _bld1 -G Ninja -DCURL_DISABLE_TYPECHECK=ON -DCURL_WERROR=ON -DENABLE_DEBUG=ON \
|
||||
-DCURL_USE_GNUTLS=ON -DCURL_USE_MBEDTLS=ON -DCURL_USE_RUSTLS=ON -DCURL_USE_WOLFSSL=ON \
|
||||
-DCURL_USE_GSASL=ON -DCURL_USE_GSSAPI=ON -DUSE_SSLS_EXPORT=ON -DUSE_ECH=ON -DENABLE_ARES=ON \
|
||||
-DCURL_DISABLE_VERBOSE_STRINGS=ON
|
||||
cmake --build _bld1
|
||||
cmake --build _bld1 --target testdeps
|
||||
cmake --build _bld1 --target curl-examples-build
|
||||
|
||||
# HTTP/3
|
||||
PKG_CONFIG_PATH="$(brew --prefix libnghttp3)/lib/pkgconfig:$(brew --prefix libngtcp2)/lib/pkgconfig:$(brew --prefix gsasl)/lib/pkgconfig"
|
||||
cmake -B _bld2 -G Ninja -DCURL_DISABLE_TYPECHECK=ON -DCURL_WERROR=ON \
|
||||
-DCURL_USE_OPENSSL=ON -DOPENSSL_ROOT_DIR="$(brew --prefix openssl)" -DUSE_NGTCP2=ON \
|
||||
-DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON \
|
||||
-DCURL_USE_GSASL=ON -DCURL_USE_GSSAPI=ON -DUSE_SSLS_EXPORT=ON -DUSE_PROXY_HTTP3=ON
|
||||
cmake --build _bld2
|
||||
cmake --build _bld2 --target testdeps
|
||||
cmake --build _bld2 --target curl-examples-build
|
||||
|
||||
_bld1/src/curl --disable --version
|
||||
_bld2/src/curl --disable --version
|
||||
fi
|
||||
|
||||
- name: 'perform analysis'
|
||||
# https://github.com/github/codeql-action/blob/main/analyze/action.yml
|
||||
uses: github/codeql-action/analyze@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0
|
||||
Reference in New Issue
Block a user