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