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