INSTALL.md (25943B)
1 <!-- 2 Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 3 4 SPDX-License-Identifier: curl 5 --> 6 7 # How to install curl and libcurl 8 9 ## Installing Binary Packages 10 11 Lots of people download binary distributions of curl and libcurl. This 12 document does not describe how to install curl or libcurl using such a binary 13 package. This document describes how to compile, build and install curl and 14 libcurl from [source code](https://curl.se/download.html). 15 16 ## Building using vcpkg 17 18 You can download and install curl and libcurl using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: 19 20 git clone https://github.com/Microsoft/vcpkg.git 21 cd vcpkg 22 ./bootstrap-vcpkg.sh 23 ./vcpkg integrate install 24 vcpkg install curl[tool] 25 26 The curl port in vcpkg is kept up to date by Microsoft team members and 27 community contributors. If the version is out of date, please [create an issue 28 or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. 29 30 ## Building from git 31 32 If you get your code off a git repository instead of a release tarball, see 33 the [GIT-INFO.md](https://github.com/curl/curl/blob/master/GIT-INFO.md) file in the root directory for specific instructions on how 34 to proceed. 35 36 # Unix 37 38 A normal Unix installation is made in three or four steps (after you have 39 unpacked the source archive): 40 41 ./configure --with-openssl [--with-gnutls --with-wolfssl] 42 make 43 make test (optional) 44 make install 45 46 (Adjust the configure line accordingly to use the TLS library you want.) 47 48 You probably need to be root when doing the last command. 49 50 Get a full listing of all available configure options by invoking it like: 51 52 ./configure --help 53 54 If you want to install curl in a different file hierarchy than `/usr/local`, 55 specify that when running configure: 56 57 ./configure --prefix=/path/to/curl/tree 58 59 If you have write permission in that directory, you can do 'make install' 60 without being root. An example of this would be to make a local install in 61 your own home directory: 62 63 ./configure --prefix=$HOME 64 make 65 make install 66 67 The configure script always tries to find a working SSL library unless 68 explicitly told not to. If you have OpenSSL installed in the default search 69 path for your compiler/linker, you do not need to do anything special. If you 70 have OpenSSL installed in `/usr/local/ssl`, you can run configure like: 71 72 ./configure --with-openssl 73 74 If you have OpenSSL installed somewhere else (for example, `/opt/OpenSSL`) and 75 you have pkg-config installed, set the pkg-config path first, like this: 76 77 env PKG_CONFIG_PATH=/opt/OpenSSL/lib/pkgconfig ./configure --with-openssl 78 79 Without pkg-config installed, use this: 80 81 ./configure --with-openssl=/opt/OpenSSL 82 83 If you insist on forcing a build without SSL support, you can run configure 84 like this: 85 86 ./configure --without-ssl 87 88 If you have OpenSSL installed, but with the libraries in one place and the 89 header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS` 90 environment variables prior to running configure. Something like this should 91 work: 92 93 CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" ./configure 94 95 If you have shared SSL libs installed in a directory where your runtime 96 linker does not find them (which usually causes configure failures), you can 97 provide this option to gcc to set a hard-coded path to the runtime linker: 98 99 LDFLAGS=-Wl,-R/usr/local/ssl/lib ./configure --with-openssl 100 101 ## Static builds 102 103 To force a static library compile, disable the shared library creation by 104 running configure like: 105 106 ./configure --disable-shared 107 108 The configure script is primarily done to work with shared/dynamic third party 109 dependencies. When linking with shared libraries, the dependency "chain" is 110 handled automatically by the library loader - on all modern systems. 111 112 If you instead link with a static library, you need to provide all the 113 dependency libraries already at the link command line. 114 115 Figuring out all the dependency libraries for a given library is hard, as it 116 might involve figuring out the dependencies of the dependencies and they vary 117 between platforms and change between versions. 118 119 When using static dependencies, the build scripts mostly assume that you, the 120 user, provide all the necessary additional dependency libraries as additional 121 arguments in the build. With configure, by setting `LIBS` or `LDFLAGS` on the 122 command line. 123 124 Building statically is not for the faint of heart. 125 126 ## Debug 127 128 If you are a curl developer and use gcc, you might want to enable more debug 129 options with the `--enable-debug` option. 130 131 curl can be built to use a whole range of libraries to provide various useful 132 services, and configure tries to auto-detect a decent default. If you want to 133 alter it, you can select how to deal with each individual library. 134 135 ## Select TLS backend 136 137 These options are provided to select the TLS backend to use. 138 139 - AmiSSL: `--with-amissl` 140 - GnuTLS: `--with-gnutls`. 141 - mbedTLS: `--with-mbedtls` 142 - OpenSSL: `--with-openssl` (also for BoringSSL, AWS-LC, LibreSSL, and quictls) 143 - rustls: `--with-rustls` 144 - Schannel: `--with-schannel` 145 - wolfSSL: `--with-wolfssl` 146 147 You can build curl with *multiple* TLS backends at your choice, but some TLS 148 backends cannot be combined: if you build with an OpenSSL fork (or wolfSSL), 149 you cannot add another OpenSSL fork (or wolfSSL) simply because they have 150 conflicting identical symbol names. 151 152 When you build with multiple TLS backends, you can select the active one at 153 runtime when curl starts up. 154 155 ## MultiSSL and HTTP/3 156 157 HTTP/3 needs QUIC and QUIC needs TLS. Building libcurl with HTTP/3 and QUIC 158 support is not compatible with the MultiSSL feature: they are mutually 159 exclusive. If you need MultiSSL in your build, you cannot have HTTP/3 support 160 and vice versa. 161 162 libcurl can only use a single TLS library with QUIC and that *same* TLS 163 library needs to be used for the other TLS using protocols. 164 165 ## Configure finding libs in wrong directory 166 167 When the configure script checks for third-party libraries, it adds those 168 directories to the `LDFLAGS` variable and then tries linking to see if it 169 works. When successful, the found directory is kept in the `LDFLAGS` variable 170 when the script continues to execute and do more tests and possibly check for 171 more libraries. 172 173 This can make subsequent checks for libraries wrongly detect another 174 installation in a directory that was previously added to `LDFLAGS` by another 175 library check. 176 177 # Windows 178 179 Building for Windows XP is required as a minimum. 180 181 You can build curl with: 182 183 - Microsoft Visual Studio 2008 v9.0 or later (`_MSC_VER >= 1500`) 184 - MinGW-w64 185 186 ## Building Windows DLLs and C runtime (CRT) linkage issues 187 188 As a general rule, building a DLL with static CRT linkage is highly 189 discouraged, and intermixing CRTs in the same app is something to avoid at 190 any cost. 191 192 Reading and comprehending Microsoft Knowledge Base articles KB94248 and 193 KB140584 is a must for any Windows developer. Especially important is full 194 understanding if you are not going to follow the advice given above. 195 196 - [How To Use the C Runtime](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time) 197 - [Runtime Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library) 198 - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries) 199 200 If your app is misbehaving in some strange way, or it is suffering from memory 201 corruption, before asking for further help, please try first to rebuild every 202 single library your app uses as well as your app using the debug 203 multi-threaded dynamic C runtime. 204 205 If you get linkage errors read section 5.7 of the FAQ document. 206 207 ## Cygwin 208 209 Almost identical to the Unix installation. Essentially run the configure script in the 210 curl source tree root with `sh configure`, then run `make`. 211 212 To expand on building with `cygwin` first ensure it is in your path, and there are no 213 conflicting tools (*i.e. Chocolatey with sed package*). If so move `cygwin` ahead of any items 214 in your path that would conflict with `cygwin` commands, making sure you have the `sh` 215 executable in `/bin/` or you see the configure fail toward the end. 216 217 Download the setup installer from 218 [`cygwin`](https://cygwin.com/) to begin. Additional `cygwin` 219 packages are needed for the install. For more on installing packages visit 220 [`cygwin setup`](https://www.cygwin.com/faq/faq.html#faq.setup.cli). 221 222 Either run setup-x86_64.exe, then search and select packages individually, or try: 223 224 setup-x86_64.exe -P binutils -P gcc-core -P libpsl-devel -P libtool -P perl -P make 225 226 If the latter, matching packages should appear in the install rows (*is fickle though*) after selecting 227 the download site i.e. `https://mirrors.kernel.org`. In either case, follow the GUI prompts 228 until you reach the "Select Packages" window; then select packages, click next, and finish 229 the `cygwin` package installation. 230 231 Download the latest version of the `cygwin` packages required (*and suggested*) for a successful install: 232 233 <details> 234 <summary>Package List</summary> 235 236 ``` 237 binutil - required 238 gcc-core - required 239 libpsl-devel - required 240 libtool - required 241 perl - required 242 make - required 243 - NOTE - if there is an error regarding make, open the cygwin terminal, and run: 244 ln -s /usr/bin/make /usr/bin/gmake 245 ``` 246 247 </details> 248 249 Once all the packages have been installed, begin the process of installing curl from the source code: 250 251 <details> 252 <summary>configure_options</summary> 253 254 ``` 255 --with-gnutls 256 --with-mbedtls 257 --with-openssl (also works for OpenSSL forks) 258 --with-rustls 259 --with-wolfssl 260 --without-ssl 261 ``` 262 263 </details> 264 265 1. `sh configure <configure_options>` 266 2. `make` 267 268 If any error occurs during curl installation, try: 269 - reinstalling the required `cygwin` packages from the list above 270 - temporarily move `cygwin` to the top of your path 271 - install all of the suggested `cygwin` packages 272 273 ## MS-DOS 274 275 You can use either autotools or cmake: 276 277 ./configure \ 278 CC=/path/to/djgpp/bin/i586-pc-msdosdjgpp-gcc \ 279 AR=/path/to/djgpp/bin/i586-pc-msdosdjgpp-ar \ 280 RANLIB=/path/to/djgpp/bin/i586-pc-msdosdjgpp-ranlib \ 281 WATT_ROOT=/path/to/djgpp/net/watt \ 282 --host=i586-pc-msdosdjgpp \ 283 --with-openssl=/path/to/djgpp \ 284 --with-zlib=/path/to/djgpp \ 285 --without-libpsl \ 286 --disable-shared 287 288 cmake . \ 289 -DCMAKE_SYSTEM_NAME=DOS \ 290 -DCMAKE_C_COMPILER_TARGET=i586-pc-msdosdjgpp \ 291 -DCMAKE_C_COMPILER=/path/to/djgpp/bin/i586-pc-msdosdjgpp-gcc \ 292 -DWATT_ROOT=/path/to/djgpp/net/watt \ 293 -DOPENSSL_INCLUDE_DIR=/path/to/djgpp/include \ 294 -DOPENSSL_SSL_LIBRARY=/path/to/djgpp/lib/libssl.a \ 295 -DOPENSSL_CRYPTO_LIBRARY=/path/to/djgpp/lib/libcrypto.a \ 296 -DZLIB_INCLUDE_DIR=/path/to/djgpp/include \ 297 -DZLIB_LIBRARY=/path/to/djgpp/lib/libz.a \ 298 -DCURL_USE_LIBPSL=OFF 299 300 Notes: 301 302 - Requires DJGPP 2.04 or upper. 303 304 - Compile Watt-32 (and OpenSSL) with the same version of DJGPP. Otherwise 305 things go wrong because things like FS-extensions and `errno` values have 306 been changed between releases. 307 308 ## AmigaOS 309 310 You can use either autotools or cmake: 311 312 ./configure \ 313 CC=/opt/amiga/bin/m68k-amigaos-gcc \ 314 AR=/opt/amiga/bin/m68k-amigaos-ar \ 315 RANLIB=/opt/amiga/bin/m68k-amigaos-ranlib \ 316 --host=m68k-amigaos \ 317 --with-amissl \ 318 CFLAGS='-O0 -msoft-float -mcrt=clib2' \ 319 CPPFLAGS=-I/path/to/AmiSSL/Developer/include \ 320 LDFLAGS=-L/path/to/AmiSSL/Developer/lib/AmigaOS3 \ 321 LIBS='-lnet -lm -latomic' \ 322 --without-libpsl \ 323 --disable-shared 324 325 cmake . \ 326 -DAMIGA=1 \ 327 -DCMAKE_SYSTEM_NAME=Generic \ 328 -DCMAKE_C_COMPILER_TARGET=m68k-unknown-amigaos \ 329 -DCMAKE_C_COMPILER=/opt/amiga/bin/m68k-amigaos-gcc \ 330 -DCMAKE_C_FLAGS='-O0 -msoft-float -mcrt=clib2' \ 331 -DAMISSL_INCLUDE_DIR=/path/to/AmiSSL/Developer/include \ 332 -DAMISSL_STUBS_LIBRARY=/path/to/AmiSSL/Developer/lib/AmigaOS3/libamisslstubs.a \ 333 -DAMISSL_AUTO_LIBRARY=/path/to/AmiSSL/Developer/lib/AmigaOS3/libamisslauto.a \ 334 -DCURL_USE_LIBPSL=OFF 335 336 ## Disabling Specific Protocols in Windows builds 337 338 The configure utility, unfortunately, is not available for the Windows 339 environment, therefore, you cannot use the various disable-protocol options of 340 the configure utility on this platform. 341 342 You can use specific defines to disable specific protocols and features. See 343 [CURL-DISABLE](https://github.com/curl/curl/blob/master/docs/CURL-DISABLE.md) 344 for the full list. 345 346 If you want to set any of these defines you have the following options: 347 348 - Modify `lib/config-win32.h` 349 - Modify `lib/curl_setup.h` 350 - Modify `winbuild/Makefile.vc` 351 - Modify the "Preprocessor Definitions" in the libcurl project 352 353 Note: The pre-processor settings can be found using the Visual Studio IDE 354 under "Project -> Properties -> Configuration Properties -> C/C++ -> 355 Preprocessor". 356 357 ## Using BSD-style lwIP instead of Winsock TCP/IP stack in Windows builds 358 359 In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is 360 necessary to make the definition of the preprocessor symbol `USE_LWIPSOCK` 361 visible to libcurl and curl compilation processes. To set this definition you 362 have the following alternatives: 363 364 - Modify `lib/config-win32.h` 365 - Modify `winbuild/Makefile.vc` 366 - Modify the "Preprocessor Definitions" in the libcurl project 367 368 Note: The pre-processor settings can be found using the Visual Studio IDE 369 under "Project -> Properties -> Configuration Properties -> C/C++ -> 370 Preprocessor". 371 372 Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, in 373 order to use it with your program it is mandatory that your program includes 374 lwIP header file `<lwip/opt.h>` (or another lwIP header that includes this) 375 before including any libcurl header. Your program does not need the 376 `USE_LWIPSOCK` preprocessor definition which is for libcurl internals only. 377 378 Compilation has been verified with lwIP 1.4.0. 379 380 This BSD-style lwIP TCP/IP stack support must be considered experimental given 381 that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl 382 might yet need some additional adjustment. 383 384 ## Important static libcurl usage note 385 386 When building an application that uses the static libcurl library on Windows, 387 you must add `-DCURL_STATICLIB` to your `CFLAGS`. Otherwise the linker looks 388 for dynamic import symbols. 389 390 ## Legacy Windows and SSL 391 392 Schannel (from Windows SSPI), is the native SSL library in Windows. However, 393 Schannel in Windows <= XP is unable to connect to servers that no longer 394 support the legacy handshakes and algorithms used by those versions. If you 395 are using curl in one of those earlier versions of Windows you should choose 396 another SSL backend such as OpenSSL. 397 398 # Android 399 400 When building curl for Android you can you CMake or curl's `configure` script. 401 402 Before you can build curl for Android, you need to install the Android NDK 403 first. This can be done using the SDK Manager that is part of Android Studio. 404 Once you have installed the Android NDK, you need to figure out where it has 405 been installed and then set up some environment variables before launching 406 the build. 407 408 Examples to compile for `aarch64` and API level 29: 409 410 with CMake, where `ANDROID_NDK_HOME` points into your NDK: 411 412 cmake . \ 413 -DANDROID_ABI=arm64-v8a \ 414 -DANDROID_PLATFORM=android-29 \ 415 -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \ 416 -DCURL_ENABLE_SSL=OFF \ 417 -DCURL_USE_LIBPSL=OFF 418 419 with `configure`, on macOS: 420 421 ```bash 422 export ANDROID_NDK_HOME=~/Library/Android/sdk/ndk/25.1.8937393 # Point into your NDK. 423 export HOST_TAG=darwin-x86_64 # Same tag for Apple Silicon. Other OS values here: https://developer.android.com/ndk/guides/other_build_systems#overview 424 export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$HOST_TAG 425 export AR=$TOOLCHAIN/bin/llvm-ar 426 export AS=$TOOLCHAIN/bin/llvm-as 427 export CC=$TOOLCHAIN/bin/aarch64-linux-android29-clang 428 export CXX=$TOOLCHAIN/bin/aarch64-linux-android29-clang++ 429 export LD=$TOOLCHAIN/bin/ld 430 export RANLIB=$TOOLCHAIN/bin/llvm-ranlib 431 export STRIP=$TOOLCHAIN/bin/llvm-strip 432 ``` 433 434 When building on Linux or targeting other API levels or architectures, you need 435 to adjust those variables accordingly. After that you can build curl like this: 436 437 ./configure --host aarch64-linux-android --with-pic --disable-shared 438 439 Note that this does not give you SSL/TLS support. If you need SSL/TLS, you 440 have to build curl with an SSL/TLS library, e.g. OpenSSL, because it is 441 impossible for curl to access Android's native SSL/TLS layer. To build curl 442 for Android using OpenSSL, follow the OpenSSL build instructions and then 443 install `libssl.a` and `libcrypto.a` to `$TOOLCHAIN/sysroot/usr/lib` and copy 444 `include/openssl` to `$TOOLCHAIN/sysroot/usr/include`. Now you can build curl 445 for Android using OpenSSL like this: 446 447 ```bash 448 LIBS="-lssl -lcrypto -lc++" # For OpenSSL/BoringSSL. In general, you need to the SSL/TLS layer's transitive dependencies if you are linking statically. 449 ./configure --host aarch64-linux-android --with-pic --disable-shared --with-openssl="$TOOLCHAIN/sysroot/usr" 450 ``` 451 452 # IBM i 453 454 For IBM i (formerly OS/400), you can use curl in two different ways: 455 456 - Natively, running in the **ILE**. The obvious use is being able to call curl 457 from ILE C or RPG applications. 458 - You need to build this from source. See `packages/OS400/README` for the ILE 459 specific build instructions. 460 - In the **PASE** environment, which runs AIX programs. curl is built as it 461 would be on AIX. 462 - IBM provides builds of curl in their Yum repository for PASE software. 463 - To build from source, follow the Unix instructions. 464 465 There are some additional limitations and quirks with curl on this platform; 466 they affect both environments. 467 468 ## Multi-threading notes 469 470 By default, jobs in IBM i does not start with threading enabled. (Exceptions 471 include interactive PASE sessions started by `QP2TERM` or SSH.) If you use 472 curl in an environment without threading when options like asynchronous DNS 473 were enabled, you get messages like: 474 475 ``` 476 getaddrinfo() thread failed to start 477 ``` 478 479 Do not panic. curl and your program are not broken. You can fix this by: 480 481 - Set the environment variable `QIBM_MULTI_THREADED` to `Y` before starting 482 your program. This can be done at whatever scope you feel is appropriate. 483 - Alternatively, start the job with the `ALWMLTTHD` parameter set to `*YES`. 484 485 # Cross compile 486 487 Download and unpack the curl package. 488 489 `cd` to the new directory. (e.g. `cd curl-7.12.3`) 490 491 Set environment variables to point to the cross-compile toolchain and call 492 configure with any options you need. Be sure and specify the `--host` and 493 `--build` parameters at configuration time. The following script is an example 494 of cross-compiling for the IBM 405GP PowerPC processor using the toolchain on 495 Linux. 496 497 ```bash 498 #! /bin/sh 499 500 export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin 501 export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" 502 export AR=ppc_405-ar 503 export AS=ppc_405-as 504 export LD=ppc_405-ld 505 export RANLIB=ppc_405-ranlib 506 export CC=ppc_405-gcc 507 export NM=ppc_405-nm 508 509 ./configure --target=powerpc-hardhat-linux 510 --host=powerpc-hardhat-linux 511 --build=i586-pc-linux-gnu 512 --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local 513 --exec-prefix=/usr/local 514 ``` 515 516 The `--prefix` parameter specifies where curl gets installed. If `configure` 517 completes successfully, do `make` and `make install` as usual. 518 519 In some cases, you may be able to simplify the above commands to as little as: 520 521 ./configure --host=ARCH-OS 522 523 # REDUCING SIZE 524 525 There are a number of configure options that can be used to reduce the size of 526 libcurl for embedded applications where binary size is an important factor. 527 First, be sure to set the `CFLAGS` variable when configuring with any relevant 528 compiler optimization flags to reduce the size of the binary. For gcc, this 529 would mean at minimum the `-Os` option, and others like the following that 530 may be relevant in some environments: `-march=X`, `-mthumb`, `-m32`, 531 `-mdynamic-no-pic`, `-flto`, `-fdata-sections`, `-ffunction-sections`, 532 `-fno-unwind-tables`, `-fno-asynchronous-unwind-tables`, 533 `-fno-record-gcc-switches`, `-fsection-anchors`, `-fno-plt`, 534 `-Wl,--gc-sections`, `-Wl,-Bsymbolic`, `-Wl,-s`, 535 536 For example, this is how to combine a few of these options: 537 538 ./configure CC=gcc CFLAGS='-Os -ffunction-sections' LDFLAGS='-Wl,--gc-sections'... 539 540 Note that newer compilers often produce smaller code than older versions 541 due to improved optimization. 542 543 Be sure to specify as many `--disable-` and `--without-` flags on the 544 configure command-line as you can to disable all the libcurl features that you 545 know your application is not going to need. Besides specifying the 546 `--disable-PROTOCOL` flags for all the types of URLs your application do not 547 use, here are some other flags that can reduce the size of the library by 548 disabling support for some features (run `./configure --help` to see them all): 549 550 - `--disable-aws` (cryptographic authentication) 551 - `--disable-basic-auth` (cryptographic authentication) 552 - `--disable-bearer-auth` (cryptographic authentication) 553 - `--disable-digest-auth` (cryptographic authentication) 554 - `--disable-http-auth` (all HTTP authentication) 555 - `--disable-kerberos-auth` (cryptographic authentication) 556 - `--disable-negotiate-auth` (cryptographic authentication) 557 - `--disable-ntlm` (NTLM authentication) 558 - `--disable-alt-svc` (HTTP Alt-Svc) 559 - `--disable-ares` (the C-ARES DNS library) 560 - `--disable-cookies` (HTTP cookies) 561 - `--disable-dateparse` (date parsing for time conditionals) 562 - `--disable-dnsshuffle` (internal server load spreading) 563 - `--disable-doh` (DNS-over-HTTP) 564 - `--disable-form-api` (POST form API) 565 - `--disable-get-easy-options` (lookup easy options at runtime) 566 - `--disable-headers-api` (API to access headers) 567 - `--disable-hsts` (HTTP Strict Transport Security) 568 - `--disable-ipv6` (IPv6) 569 - `--disable-libcurl-option` (--libcurl C code generation support) 570 - `--disable-manual` (--manual built-in documentation) 571 - `--disable-mime` (MIME API) 572 - `--disable-netrc` (.netrc file) 573 - `--disable-progress-meter` (graphical progress meter in library) 574 - `--disable-proxy` (HTTP and SOCKS proxies) 575 - `--disable-socketpair` (socketpair for asynchronous name resolving) 576 - `--disable-threaded-resolver` (threaded name resolver) 577 - `--disable-tls-srp` (Secure Remote Password authentication for TLS) 578 - `--disable-unix-sockets` (Unix sockets) 579 - `--disable-verbose` (eliminates debugging strings and error code strings) 580 - `--disable-versioned-symbols` (versioned symbols) 581 - `--enable-symbol-hiding` (eliminates unneeded symbols in the shared library) 582 - `--without-brotli` (Brotli on-the-fly decompression) 583 - `--without-libpsl` (Public Suffix List in cookies) 584 - `--without-nghttp2` (HTTP/2 using nghttp2) 585 - `--without-ngtcp2` (HTTP/2 using ngtcp2) 586 - `--without-zstd` (Zstd on-the-fly decompression) 587 - `--without-libidn2` (internationalized domain names) 588 - `--without-librtmp` (RTMP) 589 - `--without-ssl` (SSL/TLS) 590 - `--without-zlib` (gzip/deflate on-the-fly decompression) 591 592 Be sure also to strip debugging symbols from your binaries after compiling 593 using 'strip' or an option like `-s`. If space is really tight, you may be able 594 to gain a few bytes by removing some unneeded sections of the shared library 595 using the -R option to objcopy (e.g. the .comment section). 596 597 Using these techniques it is possible to create a basic HTTP-only libcurl 598 shared library for i386 Linux platforms that is only 137 KiB in size 599 (as of libcurl version 8.13.0, using gcc 14.2.0). 600 601 You may find that statically linking libcurl to your application results in a 602 lower total size than dynamically linking. 603 604 The curl test harness can detect the use of some, but not all, of the 605 `--disable` statements suggested above. Use of these can cause tests relying 606 on those features to fail. The test harness can be manually forced to skip the 607 relevant tests by specifying certain key words on the `runtests.pl` command 608 line. Following is a list of appropriate key words for those configure options 609 that are not automatically detected: 610 611 - `--disable-cookies` !cookies 612 - `--disable-dateparse` !RETRY-AFTER !`CURLOPT_TIMECONDITION` !`CURLINFO_FILETIME` !`If-Modified-Since` !`curl_getdate` !`-z` 613 - `--disable-libcurl-option` !`--libcurl` 614 - `--disable-verbose` !verbose\ logs 615 616 # Ports 617 618 This is a probably incomplete list of known CPU architectures and operating 619 systems that curl has been compiled for. If you know a system curl compiles 620 and runs on, that is not listed, please let us know. 621 622 ## 104 Operating Systems 623 624 AIX, AmigaOS, Android, ArcoOS, Aros, Atari FreeMiNT, BeOS, Blackberry 625 10, Blackberry Tablet OS, Cell OS, CheriBSD, Chrome OS, Cisco IOS, 626 DG/UX, DR DOS, Dragonfly BSD, eCOS, FreeBSD, FreeDOS, FreeRTOS, Fuchsia, 627 Garmin OS, Genode, Haiku, HardenedBSD, HP-UX, Hurd, IBM I, illumos, 628 Integrity, iOS, ipadOS, IRIX, Linux, Lua RTOS, Mac OS 9, macOS, Maemo, 629 Mbed, Meego, Micrium, MINIX, Minoca, Moblin, MorphOS, MPE/iX, MS-DOS, 630 NCR MP-RAS, NetBSD, Netware, NextStep, Nintendo 3DS Nintendo Switch, 631 NonStop OS, NuttX, OpenBSD, OpenStep, Orbis OS, OS/2, OS21, Plan 9, 632 PlayStation Portable, QNX, Qubes OS, ReactOS, Redox, RISC OS, ROS, 633 RTEMS, Sailfish OS, SCO Unix, Serenity, SINIX-Z, SkyOS, software, 634 Solaris, Sortix, SunOS, Syllable OS, Symbian, Tizen, TPF, Tru64, tvOS, 635 ucLinux, Ultrix, UNICOS, UnixWare, VMS, vxWorks, watchOS, Wear OS, 636 WebOS, Wii system Wii U, Windows CE, Windows, Xbox System, Xenix, z/OS, 637 z/TPF, z/VM, z/VSE, Zephyr 638 639 ## 28 CPU Architectures 640 641 Alpha, ARC, ARM, AVR32, C-SKY, CompactRISC, Elbrus, ETRAX, HP-PA, Itanium, 642 LoongArch, m68k, m88k, MicroBlaze, MIPS, Nios, OpenRISC, POWER, PowerPC, 643 RISC-V, s390, SH4, SPARC, Tilera, VAX, x86, Xtensa, z/arch