Added a short description of VC-WIN*-HYBRIDCRT to Windows notes
[openssl.git] / NOTES-WINDOWS.md
1 Notes for Windows platforms
2 ===========================
3
4  - [Native builds using Visual C++](#native-builds-using-visual-c++)
5  - [Native builds using Embarcadero C++Builder](
6    #native-builds-using-embarcadero-c++-builder)
7  - [Native builds using MinGW](#native-builds-using-mingw)
8  - [Linking native applications](#linking-native-applications)
9  - [Hosted builds using Cygwin](#hosted-builds-using-cygwin)
10
11 There are various options to build and run OpenSSL on the Windows platforms.
12
13 "Native" OpenSSL uses the Windows APIs directly at run time.
14 To build a native OpenSSL you can either use:
15
16     Microsoft Visual C++ (MSVC) C compiler on the command line
17 or
18     Embarcadero C++Builder
19 or
20     MinGW cross compiler
21     run on the GNU-like development environment MSYS2
22     or run on Linux or Cygwin
23
24 "Hosted" OpenSSL relies on an external POSIX compatibility layer
25 for building (using GNU/Unix shell, compiler, and tools) and at run time.
26 For this option, you can use Cygwin.
27
28 Native builds using Visual C++
29 ==============================
30
31 The native builds using Visual C++ have a `VC-*` prefix.
32
33 Requirement details
34 -------------------
35
36 In addition to the requirements and instructions listed in `INSTALL.md`,
37 these are required as well:
38
39 ### Perl
40
41 We recommend Strawberry Perl, available from <http://strawberryperl.com/>
42 Please read NOTES.PERL for more information, including the use of CPAN.
43 An alternative is ActiveState Perl, <https://www.activestate.com/ActivePerl>
44 for which you may need to explicitly build the Perl module Win32/Console.pm
45 via <https://platform.activestate.com/ActiveState> and then download it.
46
47 ### Microsoft Visual C compiler.
48
49 Since these are proprietary and ever-changing we cannot test them all.
50 Older versions may not work. Use a recent version wherever possible.
51
52 ### Netwide Assembler (NASM)
53
54 NASM is the only supported assembler. It is available from <https://www.nasm.us>.
55
56 Quick start
57 -----------
58
59  1. Install Perl
60
61  2. Install NASM
62
63  3. Make sure both Perl and NASM are on your %PATH%
64
65  4. Use Visual Studio Developer Command Prompt with administrative privileges,
66     choosing one of its variants depending on the intended architecture.
67     Or run `cmd` and execute `vcvarsall.bat` with one of the options `x86`,
68     `x86_amd64`, `x86_arm`, `x86_arm64`, `amd64`, `amd64_x86`, `amd64_arm`,
69     or `amd64_arm64`.
70     This sets up the environment variables needed for `nmake.exe`, `cl.exe`,
71     etc.
72     See also
73     <https://docs.microsoft.com/cpp/build/building-on-the-command-line>
74
75  5. From the root of the OpenSSL source directory enter
76     - `perl Configure VC-WIN32`     if you want 32-bit OpenSSL or
77     - `perl Configure VC-WIN64A`    if you want 64-bit OpenSSL or
78     - `perl Configure VC-WIN64-ARM` if you want Windows on Arm (win-arm64)
79        OpenSSL or
80     - `perl Configure VC-WIN32-HYBRIDCRT` if you want 32-bit OpenSSL dependent
81        on the Universal CRT or
82     - `perl Configure VC-WIN64A-HYBRIDCRT` if you want 64-bit OpenSSL dependent
83        on the Universal CRT or
84     - `perl Configure`              to let Configure figure out the platform
85
86  6. `nmake`
87
88  7. `nmake test`
89
90  8. `nmake install`
91
92 For the full installation instructions, or if anything goes wrong at any stage,
93 check the INSTALL.md file.
94
95 Installation directories
96 ------------------------
97
98 The default installation directories are derived from environment
99 variables.
100
101 For VC-WIN32, the following defaults are use:
102
103     PREFIX:      %ProgramFiles(x86)%\OpenSSL
104     OPENSSLDIR:  %CommonProgramFiles(x86)%\SSL
105
106 For VC-WIN64, the following defaults are use:
107
108     PREFIX:      %ProgramW6432%\OpenSSL
109     OPENSSLDIR:  %CommonProgramW6432%\SSL
110
111 Should those environment variables not exist (on a pure Win32
112 installation for examples), these fallbacks are used:
113
114     PREFIX:      %ProgramFiles%\OpenSSL
115     OPENSSLDIR:  %CommonProgramFiles%\SSL
116
117 ALSO NOTE that those directories are usually write protected, even if
118 your account is in the Administrators group.  To work around that,
119 start the command prompt by right-clicking on it and choosing "Run as
120 Administrator" before running `nmake install`.  The other solution
121 is, of course, to choose a different set of directories by using
122 `--prefix` and `--openssldir` when configuring.
123
124 Special notes for Universal Windows Platform builds, aka `VC-*-UWP`
125 -------------------------------------------------------------------
126
127  - UWP targets only support building the static and dynamic libraries.
128
129  - You should define the platform type to `uwp` and the target arch via
130    `vcvarsall.bat` before you compile. For example, if you want to build
131    `arm64` builds, you should run `vcvarsall.bat x86_arm64 uwp`.
132
133 Native builds using Embarcadero C++Builder
134 =========================================
135
136 This toolchain (a descendant of Turbo/Borland C++) is an alternative to MSVC.
137 OpenSSL currently includes an experimental 32-bit configuration targeting the
138 Clang-based compiler (`bcc32c.exe`) in v10.3.3 Community Edition.
139 <https://www.embarcadero.com/products/cbuilder/starter>
140
141  1. Install Perl.
142
143  2. Open the RAD Studio Command Prompt.
144
145  3. Go to the root of the OpenSSL source directory and run:
146     `perl Configure BC-32 --prefix=%CD%`
147
148  4. `make -N`
149
150  5. `make -N test`
151
152  6. Build your program against this OpenSSL:
153     * Set your include search path to the "include" subdirectory of OpenSSL.
154     * Set your library search path to the OpenSSL source directory.
155
156 Note that this is very experimental. Support for 64-bit and other Configure
157 options is still pending.
158
159 Native builds using MinGW
160 =========================
161
162 MinGW offers an alternative way to build native OpenSSL, by cross compilation.
163
164  * Usually the build is done on Windows in a GNU-like environment called MSYS2.
165
166    MSYS2 provides GNU tools, a Unix-like command prompt,
167    and a UNIX compatibility layer for applications.
168    However, in this context it is only used for building OpenSSL.
169    The resulting OpenSSL does not rely on MSYS2 to run and is fully native.
170
171    Requirement details
172
173    - MSYS2 shell, from <https://www.msys2.org/>
174
175    - Perl, at least version 5.10.0, which usually comes pre-installed with MSYS2
176
177    - make, installed using `pacman -S make` into the MSYS2 environment
178
179    - MinGW[64] compiler: `mingw-w64-i686-gcc` and/or `mingw-w64-x86_64-gcc`.
180      These compilers must be on your MSYS2 $PATH.
181      A common error is to not have these on your $PATH.
182      The MSYS2 version of gcc will not work correctly here.
183
184    In the MSYS2 shell do the configuration depending on the target architecture:
185
186        ./Configure mingw ...
187
188    or
189
190        ./Configure mingw64 ...
191
192    or
193
194        ./Configure ...
195
196    for the default architecture.
197
198    Apart from that, follow the Unix / Linux instructions in `INSTALL.md`.
199
200  * It is also possible to build mingw[64] on Linux or Cygwin.
201
202    In this case configure with the corresponding `--cross-compile-prefix=`
203    option. For example
204
205        ./Configure mingw --cross-compile-prefix=i686-w64-mingw32- ...
206
207    or
208
209        ./Configure mingw64 --cross-compile-prefix=x86_64-w64-mingw32- ...
210
211    This requires that you've installed the necessary add-on packages for
212    mingw[64] cross compilation.
213
214 Linking native applications
215 ===========================
216
217 This section applies to all native builds.
218
219 If you link with static OpenSSL libraries, then you're expected to
220 additionally link your application with `WS2_32.LIB`, `GDI32.LIB`,
221 `ADVAPI32.LIB`, `CRYPT32.LIB` and `USER32.LIB`. Those developing
222 non-interactive service applications might feel concerned about
223 linking with `GDI32.LIB` and `USER32.LIB`, as they are justly associated
224 with interactive desktop, which is not available to service
225 processes. The toolkit is designed to detect in which context it's
226 currently executed, GUI, console app or service, and act accordingly,
227 namely whether to actually make GUI calls. Additionally, those
228 who wish to `/DELAYLOAD:GDI32.DLL` and `/DELAYLOAD:USER32.DLL` and
229 actually keep them off service process should consider implementing
230 and exporting from .exe image in question own `_OPENSSL_isservice` not
231 relying on `USER32.DLL`. E.g., on Windows Vista and later you could:
232
233        __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
234        {
235            DWORD sess;
236
237            if (ProcessIdToSessionId(GetCurrentProcessId(), &sess))
238                return sess == 0;
239            return FALSE;
240        }
241
242 If you link with OpenSSL .DLLs, then you're expected to include into
243 your application code a small "shim" snippet, which provides
244 the glue between the OpenSSL BIO layer and your compiler run-time.
245 See also the OPENSSL_Applink manual page.
246
247 Hosted builds using Cygwin
248 ==========================
249
250 Cygwin implements a POSIX/Unix runtime system (`cygwin1.dll`) on top of the
251 Windows subsystem and provides a Bash shell and GNU tools environment.
252 Consequently, a build of OpenSSL with Cygwin is virtually identical to the
253 Unix procedure.
254
255 To build OpenSSL using Cygwin, you need to:
256
257  * Install Cygwin, see <https://cygwin.com/>
258
259  * Install Cygwin Perl, at least version 5.10.0
260    and ensure it is in the $PATH
261
262  * Run the Cygwin Bash shell
263
264 Apart from that, follow the Unix / Linux instructions in INSTALL.md.
265
266 NOTE: `make test` and normal file operations may fail in directories
267 mounted as text (i.e. `mount -t c:\somewhere /home`) due to Cygwin
268 stripping of carriage returns. To avoid this, ensure that a binary
269 mount is used, e.g. `mount -b c:\somewhere /home`.