Другое

Лучший способ кросс-компиляции QUIC для curl

Полное руководство по кросс-компиляции curl с поддержкой QUIC и HTTP/3 для Windows. Узнайте о стабильной конфигурации quictls, правильном порядке сборки и решении проблем.

Какой самый стабильный и лучший вариант собрать QUIC для curl [кросс-компиляция]?

Пробую собрать с максимальными “плюшками”:

bash
export T=x86_64-w64-mingw32

export GSASL_DIR=/root/curl-build/winlibs/gsasl-mingw

NGHTTP3_DIR=/root/curl-build/winlibs/nghttp3-1.12.0-mingw

export CPPFLAGS="-I${NGHTTP3_DIR}/include -I${GSASL_DIR}/include"
export LDFLAGS="-L${NGHTTP3_DIR}/lib -L${GSASL_DIR}/lib -lgsasl"
export LIBS="-lgsasl"

export PKG_CONFIG_PATH="/root/curl-build/winlibs/libpsl-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libidn2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/nghttp3-1.12.0-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libunistring-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libiconv-mingw/lib/pkgconfig:\/root/curl-build/winlibs/openssl-quictls-mingw/lib64/pkgconfig:\/root/curl-build/winlibs/zlib-mingw/lib/pkgconfig:\/root/curl-build/winlibs/ngtcp2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/brotli-mingw/lib/pkgconfig:\/root/curl-build/winlibs/zstd-mingw/lib/pkgconfig:\/root/curl-build/winlibs/nghttp2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libgsasl-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libssh2-mingw/lib/pkgconfig"
CC=$T-gcc AR=$T-ar RANLIB=$T-ranlib STRIP=$T-strip \
../curl-8.16.0/configure --host=$T --build=$(uname -m)-pc-linux-gnu \
  --prefix=/root/curl-build/winlibs/curl-mingw-latest \
  --with-libgsasl=/root/curl-build/winlibs/gsasl-mingw \
  --with-zlib=/root/curl-build/winlibs/zlib-mingw \
  --cache-file=config.cache \
  --with-openssl=/root/curl-build/winlibs/openssl-quictls-mingw \
  --with-ca-bundle="cacert.crt" \
  --with-ca-fallback \
  --with-ca-embed="/root/curl-8.16.0/curl-ca-bundle.crt" \
  --with-nghttp3=/root/curl-build/winlibs/nghttp3-1.12.0-mingw \
  --with-nghttp2=/root/curl-build/winlibs/nghttp2-mingw \
  --with-ngtcp2=/root/curl-build/winlibs/ngtcp2-mingw \
  --with-brotli=/root/curl-build/winlibs/brotli-mingw \
  --with-zstd=/root/curl-build/winlibs/zstd-mingw \
  --with-libidn2=/root/curl-build/winlibs/libidn2-mingw \
  --with-libpsl=/root/curl-build/winlibs/libpsl-mingw \
  --with-libssh2=/root/curl-build/winlibs/libssh2-mingw \
  --with-openssl-quic=/root/curl-build/winlibs/openssl-quictls-mingw \
  --enable-http3 \
  --enable-alt-svc \
  --enable-headers-api \
  --enable-hsts \
  --enable-websockets \
  --enable-ipv6 \
  --enable-threaded-resolver \
  --enable-httpsrr \
  --enable-sspi \
  --enable-ssls-export \
  --enable-shared

Пробовал BoringSSL, с горем пополам получилось, но при конфигурации ngtcp2 его не видит, пишет libngtcp2_crypto_boringssl: no, с quictls (который последняя версия 3.4.0) вообще не получилось скомпилить.

Вот интересует какой вариант, чтобы все всё видели и нормально скомпилить это всё.

В целом я уже собрал, но хочется, чтобы всё было последних версий.

bash
# curl --version
curl 8.16.0 (x86_64-w64-mingw32) libcurl/8.16.0 quictls/3.1.7 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.6 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.11.0 nghttp3/1.12.0 libgsasl/2.2.2
Release-Date: 2025-09-10
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli gsasl HSTS HTTP2 HTTP3 HTTPS-proxy HTTPSRR IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL SSLS-EXPORT SSPI threadsafe TLS-SRP UnixSockets zstd

Наиболее стабильным и лучшим вариантом для кросс-компиляции QUIC для curl в Windows является использование quictls с правильным порядком сборки и совместимыми версиями. Основная проблема в вашем подходе - неверная последовательность сборки и версия quictls.

bash
curl 8.16.0 (x86_64-w64-mingw32) libcurl/8.16.0 quictls/3.1.7 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.6 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.11.0 nghttp3/1.12.0 libgsasl/2.2.2

Содержание

Основные компоненты QUIC сборки

Для сборки curl с поддержкой QUIC и HTTP/3 требуется три основных компонента источник:

  1. ngtcp2 - библиотека QUIC transport implementation
  2. nghttp3 - библиотека HTTP/3 protocol implementation
  3. QUIC-capable TLS library - библиотека с поддержкой QUIC API

Важное замечание: базовый OpenSSL не предоставляет необходимые API для QUIC клиента источник.

Проблемы с текущей конфигурацией

Основные проблемы в вашем подходе:

  1. Версионная несовместимость: OpenSSL v3.5.0+ требуется для интеграции с ngtcp2 v1.12.0+ источник

  2. Дублирование конфигурации: Указаны оба варианта --with-openssl и --with-openssl-quic, что может вызывать конфликты

  3. Неверный порядок сборки: Сборка должна происходить в строгом порядке: TLS библиотека → ngtcp2 → nghttp3 → curl

  4. Отсутствие статической линковки: Для кросс-компиляции в Windows рекомендуется статическая линковка зависимостей

Оптимальная последовательность сборки

1. Сборка quictls (рекомендуемый вариант)

bash
# Клонируем quictls (OpenSSL fork с поддержкой QUIC API)
git clone --depth=1 -b openssl-3.4.0 https://github.com/quictls/openssl
cd openssl

# Конфигурация для Windows cross-compilation
./Configure --prefix=/path/to/quictls-mingw \
            --cross-compile-prefix=x86_64-w64-mingw32- \
            --openssldir=/path/to/quictls-mingw \
            no-shared \
            enable-tls1_3 \
            enable-quic

make -j$(nproc)
make install_sw

2. Сборка ngtcp2

bash
git clone --depth=1 -b v1.12.0 https://github.com/ngtcp2/ngtcp2
cd ngtcp2

# Установка зависимостей
autoreconf -fi
./configure --prefix=/path/to/ngtcp2-mingw \
            --host=x86_64-w64-mingw32 \
            --enable-lib-only \
            --with-openssl=/path/to/quictls-mingw \
            --disable-shared

make -j$(nproc)
make install

3. Сборка nghttp3

bash
git clone --depth=1 -v1.12.0 https://github.com/ngtcp2/nghttp3
cd nghttp3

autoreconf -fi
./configure --prefix=/path/to/nghttp3-mingw \
            --host=x86_64-w64-mingw32 \
            --enable-lib-only \
            --with-ngtcp2=/path/to/ngtcp2-mingw \
            --disable-shared

make -j$(nproc)
make install

Настройка переменных окружения

bash
export T=x86_64-w64-mingw32
export PREFIX=/path/to/install

# Пути к библиотекам
export QUICTLS_DIR=/path/to/quictls-mingw
export NGTCP2_DIR=/path/to/ngtcp2-mingw
export NGHTTP3_DIR=/path/to/nghttp3-mingw
export ZLIB_DIR=/path/to/zlib-mingw
export BROTLI_DIR=/path/to/brotli-mingw
export ZSTD_DIR=/path/to/zstd-mingw

# Флаги компиляции
export CPPFLAGS="-I${QUICTLS_DIR}/include \
                 -I${NGTCP2_DIR}/include \
                 -I${NGHTTP3_DIR}/include \
                 -I${ZLIB_DIR}/include \
                 -I${BROTLI_DIR}/include \
                 -I${ZSTD_DIR}/include"

export LDFLAGS="-L${QUICTLS_DIR}/lib \
                -L${NGTCP2_DIR}/lib \
                -L${NGHTTP3_DIR}/lib \
                -L${ZLIB_DIR}/lib \
                -L${BROTLI_DIR}/lib \
                -L${ZSTD_DIR}/lib"

# Отключаем pkg-config для избежания конфликтов
export PKG_CONFIG_PATH=""

Правильные флаги configure

bash
CC=$T-gcc AR=$T-ar RANLIB=$T-ranlib STRIP=$T-strip \
../curl-8.16.0/configure --host=$T --build=$(uname -m)-pc-linux-gnu \
  --prefix=${PREFIX}/curl-mingw \
  --with-openssl=${QUICTLS_DIR} \
  --with-nghttp3=${NGHTTP3_DIR} \
  --with-ngtcp2=${NGTCP2_DIR} \
  --with-zlib=${ZLIB_DIR} \
  --with-brotli=${BROTLI_DIR} \
  --with-zstd=${ZSTD_DIR} \
  --disable-shared \
  --enable-static \
  --enable-http3 \
  --enable-alt-svc \
  --enable-websockets \
  --enable-ipv6 \
  --enable-threaded-resolver \
  --enable-sspi \
  --enable-crypto-auth \
  --enable-tls-srp \
  --enable-ares \
  --enable-manual \
  --disable-ldap \
  --disable-ldaps \
  --disable-rtsp \
  --disable-dict \
  --disable-telnet \
  --disable-tftp \
  --disable-pop3 \
  --disable-imap \
  --disable-smb \
  --disable-smtp \
  --disable-gopher \
  --disable-file

Важно! Убедитесь, что все библиотеки собраны с флагом --disable-shared для статической линковки. Это предотвратит проблемы с зависимостями в Windows.

Альтернативные варианты TLS библиотек

BoringSSL

Если предпочитаете BoringSSL, используйте следующую последовательность:

bash
# Сборка BoringSSL
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \
      -DCMAKE_INSTALL_PREFIX=/path/to/boringssl-mingw ..
make -j$(nproc)
make install

# Сборка ngtcp2 с BoringSSL
./configure --with-boringssl=/path/to/boringssl-mingw

wolfSSL

bash
# Сборка wolfSSL для Windows
git clone https://github.com/wolfSSL/wolfssl
cd wolfssl
autoreconf -fi
./configure --host=x86_64-w64-mingw32 \
            --prefix=/path/to/wolfssl-mingw \
            --enable-quic \
            --enable-all \
            --disable-shared
make -j$(nproc)
make install

Примечание: wolfSSL предоставляет хорошую альтернативу, но требует дополнительных настроек для некоторых функций QUIC источник.

Верификация сборки

После сборки проверьте результат:

bash
curl --version

Должны видеть поддержку HTTP/3:

Protocols: ... HTTP3 ...
Features: ... HTTP3 ...

Проверьте поддержку QUIC:

bash
curl --http3 https://quic.nginx.org/

Если все работает, вы должны увидеть успешное подключение по HTTP/3.


Рекомендация: Используйте quictls с версией 3.4.0+ и ngtcp2 1.12.0+ для максимальной стабильности и совместимости. Этот подход обеспечивает лучшую поддержку QUIC API и минимизирует проблемы с кросс-компиляцией для Windows.

Источники

  1. HTTP/3 with curl - Official Documentation
  2. Statically linking ngtcp2 and quictls/openssl on Windows - GitHub Issue
  3. HTTP3 (and QUIC) - Fuchsia Source
  4. CMake: add HTTP/3 support - curl Commit
  5. QUIC and HTTP/3 with wolfSSL - Daniel Stenberg’s Blog

Заключение

Ключевые моменты для успешной кросс-компиляции QUIC:

  1. Используйте quictls вместо стандартного OpenSSL для лучшей QUIC поддержки
  2. Следите за версиями: quictls 3.4.0+ и ngtcp2 1.12.0+ обеспечивают совместимость
  3. Статическая линковка предпочтительнее для Windows приложений
  4. Правильный порядок сборки: TLS → ngtcp2 → nghttp3 → curl
  5. Отключайте ненужные протоколы для уменьшения размера бинарника

Действия для улучшения текущей сборки:

  • Обновите quictls до версии 3.4.0 или выше
  • Убедитесь, что ngtcp2 собран с правильным путем к quictls
  • Используйте статическую линковку всех зависимостей
  • Удалите дублирующие параметры конфигурации

Альтернативные варианты:

  • Если quictls вызывает проблемы, попробуйте BoringSSL с правильными путями
  • wolfSSL предлагает хорошую альтернативу, но требует больше ручной настройки

Эта конфигурация обеспечит стабильную и современную сборку curl с полной поддержкой QUIC и HTTP/3 для Windows.

Авторы
Проверено модерацией
Модерация