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