viewer/curl: keep <curl/curl.h> out of JFJochHttpReader.h (MSVC build fix)
Build Packages / build:windows:nocuda (pull_request) Successful in 16m7s
Build Packages / build:windows:cuda (pull_request) Successful in 17m46s
Build Packages / build:viewer-tgz:cpu (pull_request) Successful in 6m14s
Build Packages / build:viewer-tgz:cuda (pull_request) Successful in 6m46s
Build Packages / build:rpm (rocky8_nocuda) (pull_request) Successful in 8m53s
Build Packages / build:rpm (rocky9_nocuda) (pull_request) Successful in 9m59s
Build Packages / build:rpm (ubuntu2204_nocuda) (pull_request) Successful in 8m41s
Build Packages / build:rpm (ubuntu2404_nocuda) (pull_request) Successful in 8m13s
Build Packages / build:rpm (rocky8_sls9) (pull_request) Successful in 9m52s
Build Packages / build:rpm (rocky9_sls9) (pull_request) Successful in 10m36s
Build Packages / build:rpm (rocky8) (pull_request) Successful in 10m20s
Build Packages / build:rpm (ubuntu2204) (pull_request) Successful in 10m5s
Build Packages / build:rpm (rocky9) (pull_request) Successful in 11m20s
Build Packages / build:rpm (ubuntu2404) (pull_request) Successful in 9m30s
Build Packages / Generate python client (pull_request) Successful in 20s
Build Packages / XDS test (durin plugin) (pull_request) Successful in 7m8s
Build Packages / Create release (pull_request) Skipped
Build Packages / Build documentation (pull_request) Successful in 1m13s
Build Packages / XDS test (JFJoch plugin) (pull_request) Successful in 7m15s
Build Packages / DIALS test (pull_request) Successful in 11m56s
Build Packages / XDS test (neggia plugin) (pull_request) Successful in 6m22s
Build Packages / Unit tests (pull_request) Successful in 1h44m50s
Build Packages / Unit tests (push) Successful in 1h34m50s
Build Packages / build:windows:cuda (push) Successful in 12m26s
Build Packages / build:viewer-tgz:cpu (push) Successful in 6m13s
Build Packages / build:viewer-tgz:cuda (push) Successful in 6m32s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m20s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 9m25s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 8m54s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m34s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m42s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m2s
Build Packages / build:rpm (rocky8) (push) Successful in 10m9s
Build Packages / build:rpm (rocky9) (push) Successful in 9m9s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m51s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m12s
Build Packages / DIALS test (push) Successful in 11m47s
Build Packages / XDS test (durin plugin) (push) Successful in 7m34s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m45s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m45s
Build Packages / Generate python client (push) Successful in 18s
Build Packages / Build documentation (push) Successful in 54s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:nocuda (push) Failing after 2m26s

curl.h transitively includes <windows.h>, whose min/max/ERROR/LoadImage
macros clobbered every viewer TU that includes this widely-used header
(std::min/max in gemmi, the TaskState::ERROR enum, the LoadImage() calls,
the Qt/fftw cascade). It even broke JFJochHttpReader.cpp itself, since inside
the header curl.h preceded the reader/common includes that pull in gemmi.

Forward-declare the opaque easy handle (CURL is `typedef void` in libcurl)
so the header no longer needs curl.h, and include curl.h only in the .cpp,
last, after all std/project headers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 21:46:53 +02:00
co-authored by Claude Opus 4.8
parent b3b4f5824e
commit c37bc2d005
2 changed files with 11 additions and 3 deletions
+4 -1
View File
@@ -3,7 +3,6 @@
#include "JFJochHttpReader.h"
#include <curl/curl.h>
#include <cstring>
#include <mutex>
#include <nlohmann/json.hpp>
@@ -15,6 +14,10 @@
#include "../common/JFJochMath.h"
#include "../image_analysis/bragg_integration/CalcISigma.h"
// Included last, after all std/project headers: on Windows <curl/curl.h> pulls in <windows.h>,
// whose min/max (and other) macros must not precede the headers that use std::min / std::max.
#include <curl/curl.h>
namespace {
// libcurl write callback: append the received bytes to a std::string (which holds binary fine).
size_t AppendToString(char *ptr, size_t size, size_t nmemb, void *userdata) {
+7 -2
View File
@@ -3,13 +3,18 @@
#pragma once
#include <curl/curl.h>
#include "../reader/JFJochReader.h"
#include "../common/BrokerStatus.h"
#include "../common/ImageBuffer.h"
#include "../common/ROIDefinition.h"
// libcurl's easy handle, kept opaque here so this widely-included header does NOT pull in
// <curl/curl.h>. On Windows curl.h drags in <windows.h>, whose min/max/ERROR/LoadImage macros
// would then clobber every viewer translation unit that includes this header (breaking std::min /
// std::max in gemmi, the `ERROR` enum, the LoadImage() calls, ...). CURL is `typedef void` in
// libcurl; <curl/curl.h> is included only in JFJochHttpReader.cpp.
using CURL = void;
class JFJochHttpReader : public JFJochReader {
mutable std::mutex http_mutex;
std::string addr;