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